#java #android
Как можно реализовать передачу информации из одного фрагмента в другой, когда оба
эти фрагмента находятся в ViewPager?
Есть класс MainActivity, в котором я реализую ViewPager со своим собственным FragmentPagerAdapter
и также TabLayout, который отображает эти фрагменты как "табы".
Код инициализации ViewPager и TabLayout в MainActivity:
private void initTabs() {
viewPager = (ViewPager) findViewById(R.id.viewPager);
TabsPagerFragmentAdapter adapter = new TabsPagerFragmentAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(viewPager);
}
Код моего FragmentPagerAdapter:
public class TabsPagerFragmentAdapter extends FragmentPagerAdapter {
private String[] tabs;
public TabsPagerFragmentAdapter(FragmentManager fm) {
super(fm);
tabs = new String[]{
"Описание",
"Карта",
};
}
@Override
public CharSequence getPageTitle(int position) {
return tabs[position];
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return Fragment_ListFragment.getInstance();
case 1:
return Fragment_MapTab.getInstance();
}
return null;
}
@Override
public int getCount() {
return tabs.length;
}
}
Так вот, моя задача заключается в том, что мне нужно например получить некое число
в первом фрагменте и передать его во второй фрагмент, который содержится в этом же
ViewPager. Потом второй фрагмент должен принять это число и на основании его "перестроить"
свой вид (я так понимаю это число нужно будет принимать в onCreateView методе и все
"перестройку" вида проводить в нем же). После того как второй фрагмент "перестроил"
свой вид, нужно чтобы ViewPager открывал автоматически второй фрагмент(как я понял
нужно использовать метод setCurrentItem())
Собственно вопросы:
1.Как реализовать передачу данных и из одного фрагмента в другой?
2.И если я получу эти данные, то логику "перестройки" нужно описать в методе onCreateView?
Коды фрагментов:
Первый фрагмент(из которого я должен получить информацию, в данном случае - это позиция
элемента в списке):
public class Fragment_ListFragment extends ListFragment {
private ViewPager vp;
public static Fragment_ListFragment getInstance() {
Bundle args = new Bundle();
Fragment_ListFragment fragment = new Fragment_ListFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
vp = (ViewPager) getActivity().findViewById(R.id.viewPager);
ArrayAdapter adapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1, Constants.names);
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
long a = id;
Toast.makeText(getActivity(), a + "", Toast.LENGTH_SHORT).show();
vp.setCurrentItem(Constants.TAB_MAP);
}
}
Второй фрагмент(в нем я должен принять эту позицию):
public class Fragment_MapTab extends Fragment {
public static final int LAYOUT = R.layout.fragment_map_tab;
private View view;
public static Fragment_MapTab getInstance() {
Bundle args = new Bundle();
Fragment_MapTab fragment = new Fragment_MapTab();
fragment.setArguments(args);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
view = inflater.inflate(LAYOUT, container, false);
return view;
}
Ответы
Ответ 1
Вопрос можно закрыть. Можно использовать такой подход: В MainActivity нужно создать String переменную (Пусть будет TabFragment), и две функции для изменения и извлечения оной (String getTabFragment и void setTabFreagment). Во фрагменте которому нужно что-то передать создаем строку и присваиваем ей результат метода getTag(). Далее используя метод ((MainActivity)getActivity).setTabFragment(myTag) мы передаем тег нашего фрагмента нашему вышестоящему активити (вместо MainActivity может быть любой другой активити). А во фрагменте из которого извлекается информация также создаем строку, например to, и присваиваем ей результат метода ((MyActivity)getActivity).getTabFragment(). Далее получаем наш фрагмент: Fragment* fragment = (Fragment*)getActivity().getSupportFragmentManager().findFragmentByTag(to); где Fragment* - ваш класс фрагмента к которому вы хотите получить доступ. Таким образом, получив наш fragment мы можем обращаться к нему напрямую, использовать например вызов метода onCreateView с передачей нужной информации в виде Bundle. Полностью метод описан здесь http://android-er.blogspot.ru/2012/06/communication-between-fragments-in.html
Комментариев нет:
Отправить комментарий