【发布时间】:2013-10-15 23:51:32
【问题描述】:
我有这个活动,其中包含一个片段。这个片段布局由一个带有多个片段(实际上是两个)的视图分页器组成。
当视图分页器被创建时,它的适配器被创建,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;
}
I won't comment the typo :)
这是我为了更新对我的片段的引用而在我的适配器构造函数中实现的 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:这里是full code
【问题讨论】:
-
同样的问题:stackoverflow.com/questions/16299626/…你找到什么了吗?
-
不,仍在使用我的 hack。我已经检查过您提到的问题,但这并没有解决我的问题。
-
很抱歉,我还在学习 Android,我无法理解你的 hack。你能为我解释一下吗?您将该代码放在构造函数中,fm 是作为参数给出的 FragmentManager,但是 mFragment 是什么?为什么将所有 int 都设为 0 ?谢谢
-
你说得对,我忘了在这里修复一个错误(它已在我的代码中修复)。我将编辑我的答案并发布所有代码。
标签: android android-fragments android-viewpager android-adapter