假设我有一个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,因此您可以查看这些代码作为如何使用它们的示例。