我正在使用Fragments来表示我的应用程序中的不同视图。在视图之间导航时,我使用以下代码替换片段:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.main_linearlayout_fragmentcont, frag);
ft.addToBackStack(null);
ft.commit();
旋转时我遇到了很多问题,重建了活动。我需要支持旧版本的android所以android:configChanges =“orientation”不是一个选项。很多问题都归因于Android如何保存Fragment状态。
这些是我遇到的问题:
1)片段转换在旋转后自动恢复时不会记住弹出事件的自定义动画。然而他们记得我的BackStack。我知道我可以编写自己的后台处理程序,使用动画进行替换并一起摆脱弹出,但我想知道是否有办法在调用popBackStack()之前重置动画或者让FragmentManager记住旋转后自动恢复的动画。
2)我遇到的另一个问题是我的顶级片段视图中有一堆子视图(linearlayouts),它们包含自己的片段。这些子视图以编程方式创建和填充。当我的片段在旋转后重新创建时,我以编程方式重建片段对象的onCreateView中的子视图,最后在每个子视图下面都有重复的片段(1 - 我以编程方式创建,1 - Android片段从恢复创建)。我假设这是因为我在使用相同的id旋转后以编程方式重建子视图。有没有办法防止碎片被恢复?什么时候Android将片段从savedState注入这些视图我以编程方式构建?我该如何防止这种情况发生?
3)对于我的frag(Fragment)对象,上面的替换代码似乎多次触发onCreateView。当我仅运行上面的代码一次时,这是没有旋转的。是否有理由使用上述代码多次调用片段的onCreateView?
有关碎片的问题: 1)我可以阻止Android在重建活动时自动恢复片段吗?我该怎么做?它是基于LinearLayout的ID吗?我可以调用包含片段onStop的LinearLayout的removeAllViews吗?这样,视图在保存时不存在?
2)有没有办法将片段添加到我有引用但没有ID的LinearLayout?看来片段添加,替换API需要一个int ID。
谢谢!
答案 0 :(得分:3)
1)如果你发现我是怎么知道的,那我也很生气。
2)你可能在顶级片段内的FragmentTransaction上调用add
,但是还原操作也在添加,所以重复!选项1.改用replace
。选项2.(首选)检查if(savedInstances==null) { // do transaction } else { //let the system rebuilt it itself}
3)如果您正在更改作为片段一部分的视图的布局(通过调用add或replace),则管理器会调用该方法再次创建视图。我仍然不确定这是一个错误还是一个功能,如果它是一个功能,它为什么。如果你发现让我知道
1)(应该是4,不?)不要弄乱布局,如果你想删除,使用while(popBackStackImmediatly){}
删除它们,但如果你更深入了解系统正在做什么,通常没有理由不让它自动完成。
2)(应该是5,不是吗?)如果您有参考号,则您有View.getId()
快乐的编码!
答案 1 :(得分:0)
如果您更改了设备的方向,那么请检查活动中的验证,它还会使用堆栈管理片段,以便在这种情况下您的流量不会受损。
if(savedInstanceState == null) {
mFragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction =
mFragmentManager.beginTransaction();
FragmentOne fragment = new FragmentOne();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}