フラグメントを保持するこのアクティビティがあります。このフラグメント レイアウトは、いくつかのフラグメント (実際には 2 つ) を持つビュー ページャーで構成されます。
ビューページャーが作成されると、そのアダプターが作成され、getItem
呼び出されてサブフラグメントが作成されます。偉大な。
画面を回転すると、フレームワークがフラグメントの再作成を処理し、アダプタがonCreate
メイン フラグメントから再度作成されますgetItem
が、呼び出されないため、アダプタは 2 つのフラグメントではなく間違った参照 (実際には 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 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:ここに完全なコードがあります