Навигация по фрагментам с настраиваемой иерархией backstack

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

Скажем, у меня есть несколько фрагментов в backstack: A -> B -> C.
A является одним из корневых фрагментов в моем приложении, если кнопка возврата нажата на A, приложение закрывается.

Когда я нахожусь на C (с A и B в backstack), я хочу перейти к E с D в backstack. Это означает, что если я нажму кнопку возврата на E, я хочу перейти к D (D - это еще один корневой фрагмент в моем приложении, если я нажму кнопку возврата на D, приложение выйдет).

Сейчас я очищаю задний стек, затем заменяю текущий фрагмент на D, а затем на E.
Проблема в том, что я вижу фрагмент A в течение небольшого промежутка времени во время перехода от C к E. ( И это уродливо правда?)


person florian    schedule 26.11.2014    source источник


Ответы (2)


Чтобы не отображать D во время перехода от C к E, вы можете добавить логическое значение, которое отслеживает, был ли D активен в первый раз. Вы проверяете это в D onActivityCreated; если D был активен впервые (когда вы действительно хотите показать E), не загружайте контент, а затем переверните логическое значение, чтобы вы знали, что нужно загрузить контент в следующий раз, когда D будет активен.

person Patricia Li    schedule 26.11.2014
comment
Я не вижу D, я вижу A. Это результат очистки backstack (B и C удалены). Я ищу способ сделать это как следует. В iOS я бы изменил свойство NSNavigationController.viewControllers. - person florian; 27.11.2014

Первая часть, которую вы можете сделать (C -> E с D на backstack). Просто добавьте оба в одну транзакцию:

getFragmentManager().beginTransaction()
    .add(R.id.container, FragmentD.newInstance())
    .add(R.id.container, FragmentE.newInstance())
    .addToBackStack(null)
    .commit();

И тогда вы плавно перейдете к E, не увидев D, но D будет в бэкстэке под E.

К сожалению, нет другого способа удалить элементы из стека, кроме как выталкивать их из стека (вы не можете удалить что-либо из нижней части стека).

person Kevin Coppock    schedule 26.11.2014
comment
Я просматривал свои вопросы без принятых ответов, и хотя я не был тем, кто проголосовал против вашего ответа, я не думаю, что это сработает. Вы добавляете 2 фрагмента в одну транзакцию. Если вернуться назад, будут удалены 2 фрагмента одновременно. Верно? - person florian; 01.09.2015