我有以下问题:
我的应用程序需要在平板电脑上执行导航,如下所示:
+----+-------+ +----+-------+ +----+-------+ +----+-------+
| | | | | | | | | | | |
| 1 | 2 | -> | 2 | 3 | -> | 3 | 4 | -> | 4 | ... |
| | | | | | | | | | | |
+----+-------+ +----+-------+ +----+-------+ +----+-------+我尝试使用片段进行此导航,因为此导航是动态的,并且我不知道此导航将具有多少个级别。
使用API片段,我创建了以下结构来帮助测试,多次调用相同的片段:
如果左侧面板为空,请在其中插入片段。如果左侧面板不是空的,而右侧窗格是空的,请在右侧窗格中插入片段。如果这两个面板不是空的,请删除右侧面板的片段,并替换为左侧面板和。然后在右边插入新的片段。
问题是,当我尝试执行replace方法时,我发现了错误"Can not change ID of container fragment“。
查看事务的Remove方法的文档,其中包含以下信息:“删除现有的片段。如果将其添加到容器中,则其视图也将从该容器中删除。”
但是查看API代码片段,仍然有一个变量包含对前一个容器的引用: mFragmentId。
有谁知道完成此导航或重置此变量的方法吗?
发布于 2012-03-21 22:21:49
我想我找到了一个解决问题的方法:
我只使用一个布局,而不是两个布局。
这个布局的方向是水平的,那么新的片段将总是添加在左侧。
但是,使用以下代码:
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,但我仍然不知道这是否会给我带来性能问题。
ft.hide(fm.findFragmentByTag("f" + Integer.toString(navigation - 2)));这对我很管用。
发布于 2012-03-21 15:36:56
不是将碎片从一个容器移动到另一个容器,而是交换碎片容器的必要布局参数,以便获得所需的视觉效果(即,每个容器现在位于另一个容器的位置)。然后,每次添加片段时,还要执行这个容器位置交换方法。
https://stackoverflow.com/questions/9788093
复制相似问题