如何使用多个片段弹出活动堆栈?

时间:2012-01-07 20:36:22

标签: android android-fragments

Activity layout picture

假设我有一个包含两个FrameLayouts的Activity(让我们称之为FrameA和FrameB),而每个包含一个Fragment(让我们分别称它们为FragmentA1和FragmentB1)。现在,我使用类似于以下代码提交一系列单独的片段事务...

getFragmentManager()
 .beginTransaction()
 .replace(frameId, fragment)
 .addToBackStack(null)
 .commit();

...这样我用FramementA2替换FrameA中的FragmentA1,然后用FragmentB2替换FrameB中的FragmentB1,然后用FragmentA3替换FrameA中的FragmentA2,然后用FragmentB3替换Frame2中的FragmentB2,最终状态看起来像上图(只有FragmentA3和FragmentB3可见)。

如果我正确理解后堆栈是如何工作的,按“后退”将在FrameA和FrameB之间插入片段的弹出(反映我如何添加它们)。

有谁知道是否可以选择性地在FrameA或FrameB上弹出最后一笔交易? (即如果我按下'Pop FrameA',那么FrameA将从FragmentA3转换回FragmentA2,相反,如果我按下'Pop FrameB',那么FrameB将从FragmentB3转换回FragmentB2)

  

补充:我知道我可以使用FragmentManager.findFragmentById(int framelayoutId)方法将片段最后添加到给定的FrameLayout,但调用FragmentTransaction.remove(fragment).commit()仅从视图中删除片段并且不要将视图转换回之前显示的片段。

2 个答案:

答案 0 :(得分:25)

基本上,不,活动只有一个后台。

您只需要实现自己独立的后台堆栈。

从Android 4.0(以及相关的支持库)开始,有一些API可以让它变得相对简单 - FragmentTransaction.detach(Fragment)允许你将片段放入后堆栈中的状态,FragmentManager.saveFragmentInstanceState(Fragment) {{3}} 3}}让你进一步完全抛弃Fragment对象。并非巧合,它们分别用于实现ViewPager的FragmentPagerAdapter和FragmentStatePagerAdapter,因此您可以查看这些代码作为如何使用它们的示例。

答案 1 :(得分:13)

FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)

这是最简单的答案,解释非常明确:
Is this the right way to clean-up Fragment back stack when leaving a deeply nested stack?