无法保留嵌套片段

Bog*_*rac 13 android android-fragments android-fragmentactivity

还有另一种保存嵌套片段状态的方法吗?或者,如果我们不这样做,为什么?谢谢 !

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)
Run Code Online (Sandbox Code Playgroud)

nic*_*ico 8

您可以使用它FragmentManager.saveFragmentInstanceState(Fragment)来检索片段状态.返回值实现Parcelable,因此您可以将它放在Bundle中.

对于恢复,您可以在使用创建片段后提供状态Fragment.setInitialSavedState(Fragment.SavedState).

  • 据我所见,如果在父片段上设置retain instance true,则实际上不需要保留内部片段.为什么?因为它会自动保留孩子. (11认同)

Mik*_*eps 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

来自网页的代码(将其添加到您的父级片段) -

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);

    }
Run Code Online (Sandbox Code Playgroud)

  • @NecipAllef,与上面相同 - 如果你说的是坏事 - 提供更好的解决方案.只有当你知道它存在时,才能进行投票. (7认同)