【发布时间】:2012-01-07 20:36:21
【问题描述】:
假设我有一个 Activity,其中包含两个 FrameLayout(我们称它们为 FrameA 和 FrameB),而 每个 又包含一个 Fragment(我们分别称它们为 FragmentA1 和 FragmentB1)。现在,我使用类似于以下的代码提交一系列单独的片段事务...
getFragmentManager()
.beginTransaction()
.replace(frameId, fragment)
.addToBackStack(null)
.commit();
...这样我将FrameA中的FragmentA1替换为FragmentA2,然后将FrameB中的FragmentB1替换为FragmentB2,然后将FrameA中的FragmentA2替换为FragmentA3,然后将Frame2中的FragmentB2替换为FragmentB3,最终状态看起来像上图(只有 FragmentA3 和 FragmentB3 可见)。
如果我正确理解后退堆栈的工作原理,按“后退”将在 FrameA 和 FrameB 之间交错弹出片段(反映我添加它们的方式)。
有谁知道是否可以选择性地弹出 FrameA 或 FrameB 上的最后一个事务? (即,如果我按下“Pop FrameA”,那么 FrameA 将从 FragmentA3 转换回 FragmentA2,相反,如果我按下“Pop FrameB”,那么 FrameB 将从 FragmentB3 转换回 FragmentB2)
补充:我知道我可以使用
FragmentManager.findFragmentById(int framelayoutId)方法获取最后添加到给定FrameLayout 的Fragment,但是调用FragmentTransaction.remove(fragment).commit()只会从View 中移除Fragment 而不会转换View返回之前显示的 Fragment。
【问题讨论】:
-
如果 FragmentTransaction.remove “只从视图中移除 Fragment 而不会转换视图”,那么视图中显示的是什么?但是我可以理解为什么如果 Mgr 保留一堆碎片但不知道哪些碎片同时可见,这会导致混乱,即,当 B2 可能在它们之间时,它怎么知道 A2 在 A3 的“下方”堆栈?
-
如果一个视图(在我的例子中是 FrameLayout)已经使用
FragmentTransaction.add(int, Fragment)方法添加了多个 Fragment,然后调用FragmentTransaction.remove(Fragment).commit()我相信会留下 FrameLayout 显示最后添加到它的 Fragment。但是,使用FragmentTransaction.replace(int, Fragment)方法将片段添加到视图(正如我正在做的那样,假设这对内存更好?!)将使 FrameLayout 没有子级(即显示为空视图)... -
补充我之前的评论:我可以看到有一些有用的方法,如
FragmentManager.getBackStackEntryAt(int index)、FragmentManager.popBackStack(String name, int flags)、popBackStack(int id, int flags)、FragmentTransaction.addToBackStack(String name)和FragmentTransaction.replace(int containerViewId, Fragment fragment, String tag),只是不知道如何合并他们一起实现我的要求...... -
这正是我的问题,我仍在寻找答案......