我有以下问题:
我的应用程序需要在平板电脑上执行导航,如下所示:
+----+-------+ +----+-------+ +----+-------+ +----+-------+
| | | | | | | | | | | |
| 1 | 2 | -> | 2 | 3 | -> | 3 | 4 | -> | 4 | ... |
| | | | | | | | | | | |
+----+-------+ +----+-------+ +----+-------+ +----+-------+
我尝试使用FRAGMENTS进行此导航,因为导航是动态的,我不知道此导航将有多少级别。
使用API片段,我创建了以下结构来协助测试,多次调用相同的片段:
如果左侧面板为空,请将片段插入其中。 如果左面板不为空且右窗格为空,请在右窗格中插入片段。 如果两个面板不为空,请删除右面板的片段并替换左面板并为其进行操作。然后将新片段插入右侧。
问题是当我尝试执行替换方法时,我发现错误“无法更改容器片段的ID”。
查看事务的Remove方法的文档有以下信息: “删除现有的片段。如果它被添加到容器中,它的视图也会从该容器中删除。”
但是查看API代码片段,仍然有一个变量包含对前一个Container的引用:mFragmentId。
有没有人知道完成此导航或重置此变量的方法?
答案 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容器的必要布局参数,以便获得所需的视觉效果(即,每个容器现在都在另一个容器的位置)。然后,每次添加片段时,还要执行此容器位置交换方法。