13

ネストされたフラグメントの状態を保存する別の方法はありますか?または、これを行うべきではない場合、なぜですか?ありがとう !

02-13 11:42:43.258: E/AndroidRuntime(7167): java.lang.IllegalStateException: Can't retain fragements that are nested in other fragments
02-13 11:42:43.258: E/AndroidRuntime(7167):     at android.support.v4.app.Fragment.setRetainInstance(Fragment.java:742)
4

4 に答える 4

9

FragmentManager.saveFragmentInstanceState(Fragment)フラグメントの状態を取得するために使用できます。戻り値はParcelableを実装しているため、バンドルに入れることができます。

復元の場合、を使用してフラグメントを作成した後の状態を指定できますFragment.setInitialSavedState(Fragment.SavedState)

于 2013-02-13T10:11:22.543 に答える
8

ライブラリ 20+ ( https://code.google.com/p/android/issues/detail?id=74222 ) をサポートしているため、子フラグメントのインスタンスの再生成にバグがあり、修正があります - http:/ /ideaventure.blogspot.com.au/2014/10/nested-retained-fragment-lost-state.html

Web ページからのコード (これを親 Fragment に追加) -

private FragmentManager childFragmentManager() {//!!!Use this instead of getFragmentManager, support library from 20+, has a bug that doesn't retain instance of nested fragments!!!!
        if(mRetainedChildFragmentManager == null) {
            mRetainedChildFragmentManager = getChildFragmentManager();
        }
        return mRetainedChildFragmentManager;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (mRetainedChildFragmentManager != null) {
            //restore the last retained child fragment manager to the new
            //created fragment
            try {
                Field childFMField = Fragment.class.getDeclaredField("mChildFragmentManager");
                childFMField.setAccessible(true);
                childFMField.set(this, mRetainedChildFragmentManager);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);

    }
于 2015-01-28T08:29:59.217 に答える
3

これは、このAOSP commitの後、最新のサポート ライブラリの制限ではなくなりました。

以下はコミットメッセージです:

ネストされたフラグメントで setRetainInstance(true) を許可する

構成変更全体で任意にネストされたフラグメントを非構成オブジェクトとして保存します。これにより、retain-instance 子フラグメントを他のフラグメント内の任意の不透明な依存関係として使用できます。

于 2016-10-19T12:36:48.813 に答える
2

問題: mChildFrgamentManager再作成中です ( https://code.google.com/p/android/issues/detail?id=74222 )
回避策:mChildFrgamentManagerフラグメントに次のものがある場合は保持しますsetRetainInstance(true):

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if (getRetainInstance()) {
        if (mRetainedChildFragmentManager != null) {
            try {
                Field childFMField = Fragment.class.getDeclaredField("mChildFragmentManager");
                childFMField.setAccessible(true);
                childFMField.set(this, mRetainedChildFragmentManager);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            mRetainedChildFragmentManager = getChildFragmentManager();
        }
    }
}

警告:このコードでは、 のsetRetainInstace前に を呼び出す必要がありますonAttach

PS: これは @attels の回答を少し改良したものです。

于 2015-08-05T13:08:55.383 に答える