Подтвердить что ты не робот

Как поместить задний стек для 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 назад к фрагменту, который он ранее отображал.

4b9b3361

Ответ 1

В принципе, нет, для активности есть только один задний стек.

Вам просто нужно будет реализовать свои собственные отдельные стопки.

Начиная с Android 4.0 (и связанной библиотеки поддержки) есть API, которые должны сделать это относительно легко - FragmentTransaction.detach(Fragment) позволяет помещать фрагмент в том же состоянии, когда в заднем стеке, и FragmentManager.saveFragmentInstanceState(Fragment) позволяет вам продвигаться дальше и полностью отбрасывать объект Фрагмент. Не случайно они используются для реализации ViewPager FragmentPagerAdapter и FragmentStatePagerAdapter соответственно, поэтому вы можете посмотреть на код для них как пример того, как их использовать.