Как можно реализовать передачу информации из одного фрагмента в другой, когда оба эти фрагмента находятся в 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
@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;
}
Ответ
Вопрос можно закрыть. Можно использовать такой подход:
В 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
Комментариев нет:
Отправить комментарий