我有这个活动,其中包含一个片段。这个片段布局由一个带有多个片段(实际上是两个)的视图分页器组成。
创建视图寻呼机时,会创建它的适配器,getItem
调用它并创建我的子片段。伟大的。
现在,当我旋转屏幕时,框架处理片段的重新创建,适配器在我onCreate
的主片段中再次创建,但从getItem
未被调用,因此我的适配器持有错误的引用(实际上是空值)而不是两个片段。
我发现片段管理器(即子片段管理器)包含一个名为 的片段数组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;
}
我不会评论错字:)
这是我为了更新对我的片段的引用而在我的适配器构造函数中实现的 hack:
// fm holds a reference to a 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) {
// No need to fail here, likely because it's the first creation and mActive is empty
}
我并不骄傲。这有效,但它很丑。屏幕旋转后拥有有效适配器的实际方法是什么?
PS:这是完整的代码