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