Жизненный цикл замененных 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());