0

У меня есть приложение с двумя вкладками, содержащими фрагменты. Я использую FragmentPagerAdapter для управления изменениями вкладок. Все работает отлично с двумя вкладками.Восстановление фрагмента с помощью FragmentPagerAdapter

Недавно я добавил третью вкладку, и у меня проблемы. tab1 (фрагмент1) представляет собой LinearLayout небольших фрагментов. tab2 (фрагмент2) - это простой макет текста. tab3 (фрагмент3) также является простым оформлением текста.

Если я переключаюсь между tab1 и tab2, оба работают правильно и сохраняют свои состояния. Однако, если я переключаюсь между tab1 и tab3, tab3 показывает текст правильно, но tab1 показывает пустую вкладку.

Я знаю, что если вкладка занимает более 1 позиции от текущей позиции, фрагмент будет уничтожен, и фрагмент нужно будет воссоздать. FragmentPagerAdapter не делает это автоматически?

Я обнаружил, что если я поверну устройство (с выбранным tab1), фрагмент tab1 будет восстановлен с правильным состоянием, чтобы фрагмент не был уничтожен. Кажется, что есть проблема с неправильным воссозданием макета ViewPager, но это только предположение.

В качестве работы я установил myViewPager.setOffscreenPageLimit(2) и расположение сохранилось. Я бы хотел, чтобы это работало, поскольку я думаю, что он должен был не заставлять фрагменты оставаться в памяти.

ответ

0

чтения документации для setOffScreenPageLimit(), заставляет меня думать, что ваш подход хорошо. Посмотрите на это:

Если у вас есть небольшое количество страниц (3-4), которые вы можете сохранить все активные сразу, меньше времени будет потрачено в макете для вновь созданного зрения поддеревьев, как на страницах пользователей назад и вперед.

Вы должны оставить этот предел низким, особенно если ваши страницы имеют сложные схемы .

мне очень интересно, хотя, если setRetainInstance (правда) будет работать, так как это адаптер, который решает воссоздать фрагмент не то, что это получить воссозданы в течение некоторого Android операции изменения конфигурации.

+0

У меня уже установленRetainInstance (true) на фрагменте tab1, но я думаю, что я не могу установить его на фрагменты, встроенные внутри фрагмента вкладки. Основной фрагмент действительно есть, элементы меню для этой вкладки создаются правильно, а именно, что макет не отображается. Мне нужно копать глубже инспектора макета. –

+0

Я проверил, и у меня есть setRetainInsance, установленный как на фрагменте вкладок, так и на его вложенных дочерних элементах. У меня есть «добавить» функции этой вкладки, и если я использую ее, новый дочерний фрагмент будет создан. Кажется, это проблема, связанная с правильным восстановлением дочерних фрагментов. Необходимо больше копать –

0

Добавить

setRetainInstance(true); 

в onCreateView методом фрагмента

Смежные вопросы