从FragmentTransaction中删除方法不会从Container中删除片段

时间:2012-03-20 13:49:06

标签: android android-fragments

我有以下问题:

我的应用程序需要在平板电脑上执行导航,如下所示:

+----+-------+    +----+-------+    +----+-------+    +----+-------+
|    |       |    |    |       |    |    |       |    |    |       | 
|  1 |   2   | -> |  2 |  3    | -> | 3  |  4    | -> | 4  |  ...  |
|    |       |    |    |       |    |    |       |    |    |       |
+----+-------+    +----+-------+    +----+-------+    +----+-------+

我尝试使用FRAGMENTS进行此导航,因为导航是动态的,我不知道此导航将有多少级别。

使用API​​片段,我创建了以下结构来协助测试,多次调用相同的片段:

如果左侧面板为空,请将片段插入其中。 如果左面板不为空且右窗格为空,请在右窗格中插入片段。 如果两个面板不为空,请删除右面板的片段并替换左面板并为其进行操作。然后将新片段插入右侧。

问题是当我尝试执行替换方法时,我发现错误“无法更改容器片段的ID”。

查看事务的Remove方法的文档有以下信息: “删除现有的片段。如果它被添加到容器中,它的视图也会从该容器中删除。”

但是查看API代码片段,仍然有一个变量包含对前一个Container的引用:mFragmentId。

有没有人知道完成此导航或重置此变量的方法?

2 个答案:

答案 0 :(得分:2)

我想我找到了解决问题的方法:

我只使用一个布局,而不是两个布局。

此布局的方向是水平的,然后新的碎片将始终添加到左侧。

但是,使用以下代码:

Frag1 frag1 = new Frag1();
frag1.setText("Fragment " + Integer.toString(navigation));
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (navigation > 2) {
    ft.remove(fm.findFragmentByTag("f" + Integer.toString(navigation - 2)));
}
ft.add(R.id.Panes, frag1, "f" + Integer.toString(navigation));
if (navigation > 1) {
    ft.addToBackStack(null);
}
ft.commit();

我在BackStack中遇到问题,因为堆栈会插入已删除的片段并删除最后插入的片段,从而颠倒顺序。

要解决此问题,我将事务删除更改为隐藏,但我仍然不知道这是否会给我带来性能问题。

ft.hide(fm.findFragmentByTag("f" + Integer.toString(navigation - 2)));

它对我有用。

答案 1 :(得分:0)

不是将Fragments从一个容器移动到另一个容器,而是交换Fragments容器的必要布局参数,以便获得所需的视觉效果(即,每个容器现在都在另一个容器的位置)。然后,每次添加片段时,还要执行此容器位置交换方法。