FragmentManager popBackStack не удаляет фрагмент

Я реализую навигацию по меню с помощью фрагментов. Поэтому я начинаю с Home, а затем пользователи могут перемещаться по разным разделам и деталям каждого раздела.

Когда пользователь меняет секцию, я вызываю pop на стоп-память фрагментатора, пока не дойду до дома, а затем загрузите новый раздел.

Это все работает как ожидалось. Но я получаю эту проблему:

  1. Загрузите раздел, который вызывает setHasOptionsMenu (true) на onResume ()
  2. Загружает другую секцию (старая часть, которую она выбрала, чтобы выйти из стека). Я вижу, все в порядке. Меню не отображается
  3. Покиньте приложение (например, перейдите к активности Android Laucher), а затем, когда я вернусь, я вижу правильный раздел, но он показывает меню старого фрагмента.

Я выполнил повторную загрузку и распечатал каждый фрагмент, и там не фрагмент с меню.

Я помещаю отладочную метку в метод onResume () (где setHasOptionsMenu(true) ), и он действительно входит сюда, поэтому фрагмент все еще где-то.

Я хочу знать, что я делаю что-то неправильно и как я могу его решить, thx

Обновить:

Я использую этот код для загрузки новых фрагментов

 fm.beginTransaction() .add(container, sectionFragment.getFragment()) .addToBackStack(sectionFragment.getFragmentName()) .commit(); 

И для удаления:

 private void clearStack(){ int count = fm.getBackStackEntryCount(); while(count > 1){ fm.popBackStack(); count--; } } 

ПРИМЕЧАНИЕ 1. Я использую add вместо замены, потому что я не хочу потерять состояние своего фрагмента, когда я перехожу назад из раздела подробностей. Когда я загружаю другой раздел, я вызываю clearStack, чтобы поместить стек до 1, а затем загружает новый фрагмент. В конце я вызываю executePendingTransactions (), чтобы завершить удаление фрагментов из транзакции.

ПРИМЕЧАНИЕ 2. Я вижу, что он вводит мой метод onDestroy (), поэтому он считается уничтоженным. Но я не знаю, почему его снова вызывают, когда возобновляется Основная деятельность.

Solutions Collecting From Web of "FragmentManager popBackStack не удаляет фрагмент"

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

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

Это верно ТОЛЬКО, если вы используете метод getChildFragmentManager() . Этот метод ДОЛЖЕН использоваться при загрузке фрагментов внутри других фрагментов. Если нет, то фрагменты связаны с активностью фрагментов.

Я нашел этот вопрос, потому что после звонка

 fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Этот код fragmentManager.getFragments().size() возвращает максимальное количество фрагментов me, которые были в стеке. Я проверил каждый фрагмент на null. И я обнаружил, что какой-то фрагмент имеет значение null для моего случая. Может быть, это поможет кому-то)

popBackStack просто вернет ваше последнее FragmentTransaction .

Если вы используете FragmentTransaction.add , popBackStack просто вызовет FragmentTransacetion.remove .

Но если вы popBackStack FragmentTransaction.replace , popBackStack вызовет FragmentTransaction.remove и FragmentTransaction.add

Для вашего «ПРИМЕЧАНИЕ 1»: FragmentTransaction.replace не изменит ваше состояние фрагмента.

Если вы действительно хотите удалить фрагменты сразу, выполните следующие действия: Как заменить фрагменты разных типов?

В противном случае используйте замену транзакции для фрагментов, чтобы сгладить переход и свободный доступ к hassel, см. https://stackoverflow.com/a/23013075/3176433

Также ознакомьтесь с жизненным циклом фрагментации, http://developer.android.com/guide/components/fragments.html