Как получить обратно стек для действий с несколькими фрагментами? - PullRequest
49 голосов
/ 08 января 2012

Activity layout picture

Предположим, у меня есть Activity, которая содержит два FrameLayouts (назовем их FrameA и FrameB), которые в свою очередь каждый содержат Fragment (назовем их 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() только удаляет фрагмент из представления и не переводит представление обратно во фрагментэто ранее отображалось.

Ответы [ 2 ]

25 голосов
/ 17 января 2012

По сути, нет, есть только один задний стек для действия.

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

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

14 голосов
/ 06 марта 2014
FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)

Вот самый простой ответ, и объяснение очень ясное:
Является ли это правильным способом очистки заднего стека фрагмента при выходе из глубоко вложенного стека?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...