Почему нельзя использовать ViewPager внутри fragmentа? Это на самом деле

Есть информация о том, что нельзя использовать ViewPager внутри Fragment во многих источниках, таких как « Руководство для ViewPager кодеров для разработчиков Android » Марка Мерфи, или сообщения, подобные этому на SO. Я смущен, потому что у меня нет такой проблемы, и я успешно использую ViewPager в своем Fragment . Единственное отличие заключается в том, что я ViewPager экземпляр ViewPager не в onCreateView() а в onActivityCreated() . И все работает отлично.

Поэтому вопрос: может быть, я просто ничего не знаю, и по какой-то причине не рекомендуется создавать экземпляры пользовательского интерфейса в onActivityCreated() ? Но снова – все работает отлично.

Ниже приведен список classов и xml:

Класс:

 public class ViewPagerFragment extends Fragment { static final int NUM_ITEMS = 2; private ViewPagerAdapter mAdapter; private ViewPager mPager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.view_pager_fragment, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new ViewPagerAdapter(getFragmentManager()); mPager = (ViewPager) getView().findViewById(R.id.pager); mPager.setAdapter(mAdapter); } public static class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int num) { if (num == 0) { return new ItemsListFragment(); } else { return new FavsListFragment(); } } @Override public int getCount() { return NUM_ITEMS; } } } 

Планировка:

    

ОБНОВЛЕНИЕ : поскольку этот ответ был первоначально написан, теперь у вас могут быть вложенные fragmentы, а это значит, что можно использовать fragmentы ViewPager для страниц и быть в самом fragmentе. Этот образец проекта демонстрирует технику.

Теперь я возвращаю вас к вашему регулярному ответу, представленному в полном объеме …


Цитирую себя из книги:

Простейший способ использования ViewPager состоит в том, чтобы его fragmentы страниц отображались и выходили из экрана на основе пользовательских проверок. Это работает только в том случае, если сам ViewPager не содержится внутри fragmentа, так как вы не можете иметь fragmentы, вложенные внутри других fragmentов.

Цитата Dianne Hackborn :

Вложенные fragmentы в настоящее время не поддерживаются. Попытка поместить fragment в пользовательский интерфейс другого fragmentа приведет к неопределенному и, вероятно, нарушенному поведению.

Вполне возможно поставить ViewPager внутри Fragment , если содержимое ViewPager не содержит самих fragmentов . Поскольку в конкретных реализациях PagerAdapter поставляемых пакетом поддержки Android, используются fragmentы, вам необходимо свернуть свой собственный без fragmentа PagerAdapter чтобы поместить ViewPager в fragment.

Я постараюсь сделать это более ясным в следующем издании книги (если вы не англичане, и в этом случае я постараюсь сделать эту мысль более ясной :-).

Для реализации пейджера View внутри fragmentа используйте getChildFragmentManager () вместо getFragmentManager () . Вы можете вызвать setAdapter () для ViewPager из onCreateView () или onActivityCreated () , это не вопрос.

Надеюсь, это поможет вам, ребята.

Инициализация SetionPageAdapter для ViewPager использует «getChildFragmentManager ()».

mSectionsPagerAdapter = новые SectionsPagerAdapter (getChildFragmentManager ());

можно попробовать сделать этот код и сохранить view_pager_fragment.xml

     

ViewPagerFragment

 ViewPager viewPager; TabLayout tabLayout; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tracks, container, false); viewPager = (ViewPager) view.findViewById(R.id.viewpager); tabLayout = (TabLayout) view.findViewById(R.id.tab); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setupViewPager(viewPager); tabLayout.setupWithViewPager(viewPager); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());`` viewPagerAdapter.addFragment(new FirstFragment(), "First"); viewPagerAdapter.addFragment(new SecoundFragment(), "Secound"); viewPagerAdapter.addFragment(new LoginFragment(), "Login"); viewPager.setAdapter(viewPagerAdapter); } private class ViewPagerAdapter extends FragmentPagerAdapter { List fragmentList = new ArrayList<>(); List fragmentTitles = new ArrayList<>(); public ViewPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return fragmentTitles.get(position); } public void addFragment(Fragment fragment, String name) { fragmentList.add(fragment); fragmentTitles.add(name); } } 
  • PreferenceFragmentCompat требует, чтобы preferenceTheme был установлен
  • Адаптер пейджера не отображает изображение после получения ответа от fragmentа
  • Удаление старого fragmentа из диспетчера fragmentов
  • Панель инструментов Android Добавление элементов меню для разных fragmentов
  • Дублирование fragmentов на транзакции fragmentов
  • Когда fragment fragmentа с SwipeRefreshLayout во время обновления, fragment замерзает, но на самом деле все еще работает
  • Проблема ViewPager + RecyclerView в android
  • Заполненная активность ADT, созданная с использованием fragmentов.
  • Борьба с fragmentом поддержки проигрывателя Youtube
  • Как установить ширину и высоту DialogFragment?
  • FragmentPagerAdapter getItem не вызывается
  • Давайте будем гением компьютера.