Я реализую навигацию по меню с помощью фрагментов. Поэтому я начинаю с Home, а затем пользователи могут перемещаться по разным разделам и деталям каждого раздела.
Когда пользователь меняет секцию, я вызываю pop на стоп-память фрагментатора, пока не дойду до дома, а затем загрузите новый раздел.
Это все работает как ожидалось. Но я получаю эту проблему:
Я выполнил повторную загрузку и распечатал каждый фрагмент, и там не фрагмент с меню.
Я помещаю отладочную метку в метод 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 (), поэтому он считается уничтоженным. Но я не знаю, почему его снова вызывают, когда возобновляется Основная деятельность.
Я обнаружил, что проблема заключается не в логике добавления и удаления фрагмента стека.
Проблема заключалась в том, что часть фрагмента загружала в него другие фрагменты (у него был компонент 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