フラグメントを保持するこのアクティビティがあります。このフラグメント レイアウトは、いくつかのフラグメント (実際には 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:ここに完全なコードがあります