4

我正在使用 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。我知道我可以编写自己的后处理程序,它使用动画进行替换并一起摆脱 pop 但我想知道是否有办法在调用 popBackStack() 之前重置动画或让 FragmentManager 记住旋转后自动恢复时的动画。

2)我遇到的另一个问题是我的一个顶级片段视图中有一堆子视图(线性布局),其中包含它们自己的片段。这些子视图以编程方式创建和填充。当我的片段在旋转后重新创建时,我以编程方式重建片段对象的 onCreateView 中的子视图,最终在每个子视图下都有重复的片段(1 - 我以编程方式创建和 1 - Android 片段从恢复创建)。我假设这是因为我在旋转后以相同的 ID 以编程方式重建子视图。有没有办法防止碎片被恢复?Android 何时将来自 savedState 的片段注入到我以编程方式构建的这些视图中?我将如何防止这种情况发生?

3) 上面的替换代码似乎为我的 frag (Fragment) 对象多次触发 onCreateView。这是没有轮换的,当我只运行一次上述代码时就会发生这种情况。是否有理由使用上述代码多次调用 Fragment 的 onCreateView?

关于 Fragments 的问题: 1)我可以阻止 Android 在重建 Activity 时自动恢复 Fragment 吗?我该怎么办?是基于LinearLayout的ID吗?我可以调用包含片段 onStop 的 LinearLayout 的 removeAllViews 吗?这样保存时视图不存在吗?

2) 有没有办法将片段添加到我有参考但没有 ID 的 LinearLayout?似乎片段添加、替换 API 需要一个 int ID。

谢谢!

4

2 回答 2

3

1)如果你知道如何让我知道,我也很生气

2)您可能正在调用add顶级片段内的 FragmentTransaction,但恢复操作也在添加,所以重复!选项 1.replace改为使用。选项 2.(首选)检查if(savedInstances==null) { // do transaction } else { //let the system rebuilt it itself}

3) 如果您正在更改作为片段一部分的视图的布局(通过调用添加或替换),则管理器调用该方法以再次创建视图。我仍然不确定这是一个错误还是一个功能,如果它是一个功能,为什么会这样。如果你发现让我知道

1)(应该是 4,不是吗?)不要弄乱布局,如果您想删除,请使用 删除它们while(popBackStackImmediatly){},但是如果您深入了解系统在做什么,通常没有理由不让它自动完成。

2) (应该是 5,不是吗?)如果你有参考,你有 id View.getId()

快乐编码!

于 2013-01-10T17:55:28.460 回答
0

如果您要更改设备的方向,请检查活动中的验证,它还使用堆栈管理片段,因此在这种情况下您的流程不会损坏。

if(savedInstanceState == null) {

   mFragmentManager = getSupportFragmentManager();
   FragmentTransaction fragmentTransaction = 

   mFragmentManager.beginTransaction();

   FragmentOne fragment = new FragmentOne();

   fragmentTransaction.add(R.id.fragment_container, fragment);
   fragmentTransaction.commit();
}
于 2016-01-02T08:47:49.560 回答