假设我有一个Activity,其中包含两个FrameLayout(分别称为FrameA和FrameB),而每个依次又包含一个Fragment(分别称为FragmentA1和FragmentB1)。现在,我使用类似于以下代码的方式提交一系列单独的片段事务...

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

...这样,我用FragmentA2替换了FrameA中的FragmentA1,然后用FragmentB2替换了FrameB中的FragmentB1,然后用FragmentA3替换了FrameA中的FragmentA2,然后用FragmentB3替换了Frame2中的FragmentB2,最终状态如上图所示(其中只有FragmentA3和FragmentB3可见)。

如果我正确理解了后堆栈的工作方式,则按“后退”将交错出现FrameA和FrameB之间的片段(反射(reflect)了我如何添加它们)。

有谁知道是否有可能有选择地在FrameA或FrameB上弹出最后一个事务? (即,如果我按“Pop FrameA”,则FrameA将从FragmentA3转换回FragmentA2;相反,如果我按“Pop FrameB”,则FrameB将从FragmentB3转换回FragmentB2)

最佳答案

基本上,不,一项 Activity 只​​有一个后备箱。

您只需要实现自己的单独的堆栈即可。

从Android 4.0(及相关的支持库)开始,有一些API应当使此操作相对容易-FragmentTransaction.detach(Fragment)使您可以将片段放到与返回堆栈中相同的状态,而FragmentManager.saveFragmentInstanceState(Fragment)则可以使您走得更远并完全丢弃片段对象。并非巧合的是,它们分别用于实现ViewPager的FragmentPagerAdapter和FragmentStatePagerAdapter,因此您可以查看这些代码作为如何使用它们的示例。

10-08 03:25