2015-04-08 6 views
2

У меня есть действие A, которое содержит фрагмент F. A показывает F, нажимая его на задний стек фрагментатора. Этот фрагмент может отображать диалог (точнее, DialogFragment) D, также путем нажатия его в задний стек того же менеджера фрагмента.Как удалить фрагмент из диспетчера фрагментов при восстановлении активности после уничтожения

Мне нужно уметь отменить диалог D при определенных обстоятельствах, которые определяются фрагментом F. Обычно я проверяю, находится ли D в стеке менеджера фрагмента и использует getFragmentManager(). PopBackStack(), чтобы удалить его. Но это не работает, если активность разрушается, а затем воссоздается:

Скажем, я установил флаг «Не держать действия» в настройках Android. Теперь я использую приложение. Активность разрушается, а фрагменты тоже. Теперь я снова переопределяю приложение. В какой момент фрагменты F и D добавляются в задний стек фрагмента менеджера? Это скриншот я взял после того, как я поставил точку останова() метод, который я предполагаю, что это самый последний один для запуска в жизненном цикле активности, прежде чем пользователь может использовать приложение onPostResume в:

enter image description here

Вы можете заметить, что поле mAdded содержит 2 элемента - это восстановленные фрагменты F и D. Но они еще не установлены в стеке, поскольку mBackStack имеет значение null!

Я хотел был бы уметь удалить D, но Android не позволит мне сделать это, так как он ждет восстановления ранее существовавшего состояния фрагментов, и он не добавит их в задний стек до некоторого времени после onPostResume.

Так что, по сути, я не могу удалить фрагмент из стека, так как он еще не находится в стеке. И я также не могу помешать его добавить в стек в какой-то момент, так как, как вы можете видеть из скриншота выше, менеджер фрагментов хранит его в отдельном списке mAdded, и нет методов, которые я могу использовать для его удаления из mAdded.

Как предотвратить восстановление сохраненного фрагмента?

ответ

1

Возможно, я ошибаюсь, но AFAIK AOS не хранит фрагмент назад, если активность остановлена. Он мог восстановить только последний показанный фрагмент без всех предыдущих фрагментов в стеке.
Однако вы можете хранить стек, а фрагменты - сами. Просто удалите свой диалог в , сохранив некоторый флаг через onSaveInstanceState, а затем в onResume восстановите его или нет.

+0

«AFAIK AOS не хранит фрагмент backstack вообще, если активность останавливается» - интересно, но в моем случае он четко хранит 2 фрагмента и знает, как вернуть их обратно в стопку в правильной последовательности. Возможно, это потому, что верхний - это диалог, а первый вид снизу? –

+0

«Просто удалите свой диалог в onPause, сохраняя некоторый флаг через onSaveInstanceState, а затем в onResume восстановите его или нет». - похоже, это может сработать. Я буду искать еще несколько, и если я не найду другого решения, я приму свой ответ. –