Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Передача информации из фрагмента в фрагмент, которые находятся во ViewPager

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


Ответ

Вопрос можно закрыть. Можно использовать такой подход:
В 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

Комментариев нет:

Отправить комментарий