Жизненный цикл замененных ViewPager и BackStack?
Я действительно запутался в жизненном цикле Android ViewPager и начинаю думать, что в структуре моего приложения что-то не так. Поэтому я хотел бы получить подтверждение, если я могу сделать следующее:
- У меня есть приложение, показывающее некоторые вкладки. Одна из этих вкладок показывает ViewPager, в котором есть два ListFragments. Эти ListFragments создаются в событии onCreateViewPager.
- Когда вы щелкаете элемент в одном из ListFragments, он заменяет весь ViewPagerFragment другим фрагментом (который является другим ListFrament).
Вот код, который я использую для замены ViewPager новым ListFragment
FragmentManager fm = getFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, new RequestForm(requestsList.get(itemIndex)));
ft.addToBackStack(null);
ft.commit();
Оттуда все работает нормально. Но, если пользователь нажимает кнопку "Назад", я получаю следующую ситуацию:
- ViewPager перезагружается нормально (из onCreateView), но внутри ListFragment не будет отображаться. Похоже, мой объект ListFragment еще жив, но кажется, что он потерял свое представление, и onCreateView не вызывается, чтобы воссоздать его (потому что объект не спал, пока ViewPager не было).
Сейчас я не публикую здесь больше кода, потому что я намерен узнать, нормально ли то, что я пытаюсь сделать, с точки зрения Android. Придется ли мне бороться с Android SDK, чтобы архивировать то, что я хочу сделать?
1 ответ
Ну, как вы видите, я не пользователь Android (я знаю гораздо больше об интерфейсе на iOS). Вот почему я был сбит с толку.
Посмотрев другие приложения, я обнаружил, что в Gmail и Google Play есть навигация, которая немного похожа на мою (замена ViewPager на новый фрагмент без создания нового действия).
И для моей проблемы это не было структурной проблемой. Когда вы создаете FragmentStatePagerAdapter, обязательно используйте getChildFragmentManager(), а не getFragmentManager()!
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());