Как поместить задний стек для Activity с несколькими фрагментами?
![Activity layout picture]()
Предположим, что у меня есть Activity, который содержит два FrameLayouts (пусть их называют FrameA и FrameB), которые, в свою очередь, содержат фрагмент (пусть их называют FragmentA1 и FragmentB1 соответственно). Теперь я совершаю серию транзакций отдельных фрагментов, используя код, похожий на следующий...
getFragmentManager()
.beginTransaction()
.replace(frameId, fragment)
.addToBackStack(null)
.commit();
... так что я заменяю FragmentA1 в FrameA на FragmentA2, тогда я заменяю FragmentB1 в FrameB на FragmentB2, а затем заменяю FragmentA2 в FrameA на FragmentA3, а затем заменяю FragmentB2 в Frame2 на FragmentB3, а конечное состояние выглядит как рисунок выше (где видны только FragmentA3 и FragmentB3).
Если я правильно понял, как работает задний стек, нажатие "назад" будет чередовать фрагменты фрагментов между FrameA и FrameB (отражая, как я их добавил).
Кто-нибудь знает, можно ли выборочно вывести последнюю транзакцию в FrameA или FrameB? (т.е. если бы я нажал "Pop FrameA", тогда FrameA был бы переведен обратно с FragmentA3 на FragmentA2, и вместо этого, если бы я нажал "Pop FrameB", тогда FrameB был бы переведен обратно из FragmentB3 в FragmentB2)
Дополнение: Я знаю, что могу добавить последний фрагмент в данный FrameLayout с помощью метода FragmentManager.findFragmentById(int framelayoutId)
, но вызов FragmentTransaction.remove(fragment).commit()
удаляет только фрагмент из представления и не переводит View назад к фрагменту, который он ранее отображал.
Ответы
Ответ 1
В принципе, нет, для активности есть только один задний стек.
Вам просто нужно будет реализовать свои собственные отдельные стопки.
Начиная с Android 4.0 (и связанной библиотеки поддержки) есть API, которые должны сделать это относительно легко - FragmentTransaction.detach(Fragment) позволяет помещать фрагмент в том же состоянии, когда в заднем стеке, и FragmentManager.saveFragmentInstanceState(Fragment) позволяет вам продвигаться дальше и полностью отбрасывать объект Фрагмент. Не случайно они используются для реализации ViewPager FragmentPagerAdapter и FragmentStatePagerAdapter соответственно, поэтому вы можете посмотреть на код для них как пример того, как их использовать.
Ответ 2
FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
Вот простейший ответ, и объяснение очень ясное:
Правильно ли он очищает стопку фрагмента при выходе из глубоко вложенного стека?