首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FragmentTransaction中的Remove方法不会从容器中删除片段

问FragmentTransaction中的Remove方法不会从容器中删除片段
EN

Stack Overflow用户
提问于 2012-03-20 21:49:06
回答 2查看 4.4K关注 0票数 5

我有以下问题:

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

代码语言:javascript
复制
+----+-------+    +----+-------+    +----+-------+    +----+-------+
|    |       |    |    |       |    |    |       |    |    |       | 
|  1 |   2   | -> |  2 |  3    | -> | 3  |  4    | -> | 4  |  ...  |
|    |       |    |    |       |    |    |       |    |    |       |
+----+-------+    +----+-------+    +----+-------+    +----+-------+

我尝试使用片段进行此导航,因为此导航是动态的,并且我不知道此导航将具有多少个级别。

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

如果左侧面板为空,请在其中插入片段。如果左侧面板不是空的,而右侧窗格是空的,请在右侧窗格中插入片段。如果这两个面板不是空的,请删除右侧面板的片段,并替换为左侧面板和。然后在右边插入新的片段。

问题是,当我尝试执行replace方法时,我发现了错误"Can not change ID of container fragment“。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-21 22:21:49

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

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

这个布局的方向是水平的,那么新的片段将总是添加在左侧。

但是,使用以下代码:

代码语言:javascript
复制
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中遇到了一个问题,因为堆栈将插入删除的片段,并删除最后插入的片段,顺序颠倒。

为了解决这个问题,我将transaction remove改为hide,但我仍然不知道这是否会给我带来性能问题。

代码语言:javascript
复制
ft.hide(fm.findFragmentByTag("f" + Integer.toString(navigation - 2)));

这对我很管用。

票数 2
EN

Stack Overflow用户

发布于 2012-03-21 15:36:56

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9788093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档