2012-01-07 2 views
44

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

+1

Если FragmentTransaction.remove «удаляет только фрагмент из представления и не переведет View», то, что показывается в вид? Но я могу понять, почему это может вызвать путаницу, если Mgr хранит один стек фрагментов, но не знает, какие из них одновременно видны, т. Е. Как он узнает, что A2 «находится под» A3, когда B2 может находиться между ними на стек? – gordonwd

+0

Если в представлении (FrameLayout в моем случае) было добавлено несколько фрагментов, используя метод 'FragmentTransaction.add (int, Fragment)', тогда вызов 'FragmentTransaction.remove (Fragment) .commit()' Я считаю, FrameLayout, показывающий последний добавленный фрагмент. Однако добавление фрагментов в представление с использованием метода 'FragmentTransaction.replace (int, Fragment)' (как я делаю, считая, что это лучше для памяти ?!) оставит без рамки FrameLayout (т. Е. Отображается как пустой вид) ... –

+0

Чтобы добавить к моему предыдущему комментарию: я вижу, что есть некоторые полезные методы, такие как 'FragmentManager.getBackStackEntryAt (int index)', 'FragmentManager.popBackStack (String name, int flags) ',' popBackStack (int id, int flags) ',' FragmentTransaction.addToBackStack (String name) 'и' FragmentTransaction.replace (int containerViewId, фрагмент фрагмента, тег String) ', просто не уверен как объединить их вместе для достижения того, что мне нужно ... –

ответ

22

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

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

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

+0

Спасибо за ответ Hackbod. Я должен был добиться прогресса в том, что, как я знал, реализовал решение, где я скрываю фрагмент A1 перед _adding_ (а не _replacing_) Фрагмент A2 поверх него, а затем _showing_ Фрагмент A1 снова, когда фрагмент A2 удален. Он работает для меня, но определенно будет реализовывать мои собственные задние стеки, как вы описали в будущих проектах, или если какое-либо нежелательное поведение будет выглядеть в настоящем: - \ Спасибо еще раз. –

Смежные вопросы