Android碎片问题

时间:2013-01-10 17:27:10

标签: android android-layout android-fragments

我正在使用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。

谢谢!

2 个答案:

答案 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();
}