FragmentPagerAdapter внутри фрагмента

У меня возникли проблемы с реализацией дизайна, основанного на нескольких ViewPager.

На высоком уровне у меня есть FragmentActivity только с FrameLayout в качестве содержимого. У меня есть 3 разных фрагмента, которые я хочу отобразить. Все 3 полноэкранные, и только 1 будет использоваться одновременно.

Фрагмент 1 — это базовый фрагмент с некоторыми объектами TextView и ImageView. Фрагмент 2 имеет ViewPager и FragmentPagerAdapter, которые передают ему несколько простых фрагментов. Фрагмент 3 имеет ViewPager и FragmentPagerAdapter, которые передают ему несколько простых фрагментов (отличных от фрагмента 2).

В моей FragmentActivity onCreate() я получаю FragmentManager и начинаю транзакцию, чтобы заменить все, что есть в моем FrameLayout, новым экземпляром Fragment 2.

На данный момент все работает так, как ожидалось. Мой ViewPager во фрагменте 2 работает отлично.

Теперь у меня есть пункт меню, который заменяет Fragment 2 в моем FrameLayout новым экземпляром Fragment 3. Это также отлично работает.

Проблема возникает, когда я пытаюсь поместить фрагмент 2 обратно в FrameLayout с помощью другой транзакции замены. Я вижу свой PagerIndicater вверху, но мои страницы пусты.

Я попытался просто создать новый экземпляр моего фрагмента 2 и вызвать транзакцию замены. Я также пытался установить тег для своих фрагментов, когда я вызываю замену, и добавлял проверку findFragmentByTag перед моей заменой вместо создания нового экземпляра. Оба дали мне тот же результат пустых страниц после моей второй замены.

Для справки. Мой первый дизайн был просто FragmentActivity с ViewPager и ViewIndicater. У меня были только Фрагмент 2 и Фрагмент 3 из моего описания выше и опция меню для переключения между ними. Для переключения у меня было определено 2 разных FragmentPagerAdapter, и я просто вызвал ViewPager.setAdapter, чтобы установить выбранный FragmentPagerAdapter. Это работало отлично, но теперь мне нужен новый фрагмент верхнего уровня, который вообще не использует ViewPager. Вот почему я решил переместить свои ViewPager в их собственные фрагменты. Моя идея заключалась в том, что я просто поменяю свои фрагменты на FrameLayout.

У меня сейчас нет кода передо мной, поэтому я не могу его опубликовать, но завтра я добавлю код к своему вопросу, чтобы облегчить ответы.


comment
У меня были проблемы с адаптерами при использовании фрагментов во фрагментах. Я не уверен, что это то же самое, что и у вас, но попробуйте поместить вызов setAdapter в Runnable. См. здесь: stackoverflow.com/a/10358889/377260   -  person Paul Burke    schedule 22.08.2012


Ответы (2)


Этот вопрос является возможным дубликатом Назад к FragmentPagerAdapter -›фрагменты пусты.

Если ваше приложение может с этим справиться (API 17), используйте getChildFragmentManager(). Эта проблема возникает при использовании Fragment для размещения ViewPager и использовании FragmentPagerAdapter. Переход на FragmentStatePagerAdapter, похоже, также решил проблему, но я по-прежнему считаю, что использование getChildFragmentManager() — самый разумный способ.

person blinkmacalahan    schedule 26.09.2013
comment
Использование FragmentStatePagerAdapter вместо FragmentPagerAdapter помогло мне :) - person Patrick Boos; 27.11.2013
comment
Привет, я также использовал FragmentStatePagerAdapter для этой проблемы. Но тут я заметил, что фрагменты не удаляются из памяти? Они просто продолжают добавлять и это возможная утечка памяти. Это можно обойти? - person John Ernest Guadalupe; 29.11.2015
comment
@JohnErnestGuadalupe Откуда вы знаете, что этот фрагмент все еще находится в памяти? - person rupinderjeet; 30.06.2017

брокколи можно использовать не "хорошим способом". Но для моего это сработало.

Вы можете использовать в представлении 2 макета, где вы связываете фрагменты. Первый - за фрагмент с фрагментами. Второй - для других фрагментов.

При замене фрагмента фрагментами не заменять, а только менять видимость первого макета на исчезнувший и добавлять новый фрагмент во второй макет. На обратной стороне удалите фрагмент из второго макета и установите видимость для первого макета.

person Yura Shinkarev    schedule 17.12.2012