我正在使用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。我知道我可以编写自己的后退处理程序,使用动画进行替换并完全摆脱pop,但我想知道是否有一种方法可以在调用popBackStack()之前重置动画或让FragmentManager在自动旋转后记住动画。
2)我还有另一个问题,我在一个顶级片段视图中有一堆子视图(线性布局),它们包含自己的片段。这些子视图是以编程方式创建和填充的。在旋转后重新创建我的片段时,在Fragment对象的onCreateView中以编程方式重建子视图,然后在每个子视图下面得到重复的片段(1-我以编程方式创建,1- Android Fragments从恢复中创建)。我假设这是因为我在旋转后以相同的id以编程方式重建了子视图。有没有办法防止Fragments被恢复?Android何时将Fragments从savedState注入到这些我以编程方式构建的视图中?我该如何防止这种情况发生?
3)上面的替换代码似乎会多次触发我的片段对象的onCreateView。这是没有旋转时发生的,只有在我仅运行上述代码一次时才会发生。片段的onCreateView被调用多次的原因是什么?
关于片段的问题: 1)我能否防止Android在重建活动时自动恢复片段?我该如何做到这一点?它是基于LinearLayout的ID吗?我可以在onStop时调用LinearLayout的removeAllViews吗?这样保存时就不存在该视图了吗?
2)是否有一种方法可以将片段添加到我引用但没有ID的LinearLayout中?似乎Fragment add、replace API需要一个int ID。
谢谢!