如何正确处理ViewPager和嵌套片段的屏幕旋转?
如何正确处理ViewPager和嵌套片段的屏幕旋转?
我有一个包含一个片段的活动。这个片段布局由一个带有几个片段(实际上是两个)的视图页组成。
当视图页被创建时,它的适配器也被创建了,getItem方法被调用,并且我的子片段被创建了。很好。
现在,当我旋转屏幕时,框架会处理片段的重新创建,在我的主片段的onCreate方法中再次创建适配器,但是getItem方法从未被调用,所以我的适配器保存了错误的引用(实际上是null),而不是这两个片段。
我发现的是片段管理器(也就是子片段管理器)包含一个名为mActive的片段数组,当然不能从代码中访问。然而有这个getFragment方法:
@Override
public Fragment getFragment(Bundle bundle, String key) {
int index = bundle.getInt(key, -1);
if (index == -1) {
return null;
}
if (index >= mActive.size()) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index));
}
Fragment f = mActive.get(index);
if (f == null) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index));
}
return f;
}
我在适配器的构造函数中实现了这个黑科技来更新对我的片段的引用:
// fm保存了对FragmentManager的引用
Bundle hack = new Bundle();
try {
for (int i = 0; i < mFragments.length; i++) {
hack.putInt("hack", i);
mFragments[i] = fm.getFragment(hack, "hack");
}
} catch (Exception e) {
// 不需要在这里失败,可能是因为这是第一次创建,mActive为空
}
我并不自豪。这个方法可行,但很丑陋。有没有实际的方法在屏幕旋转后获得一个有效的适配器?
PS:这里是完整的代码。