为什么popbackstack调用片段的onCreateView?

Min*_*ran 16 android fragment

试图解释为什么在我弹回堆叠片段时调用onCreateView.

使用以下代码:

fragmentManager.popBackStack("tag1", 1); 
ft = fragmentManager.beginTransaction(); 
ft.remove(fragmentManager.findFragmentByTag("tag1")); 
ft.commit();
Run Code Online (Sandbox Code Playgroud)

logcat的:

FATAL EXCEPTION: main
java.lang.IndexOutOfBoundsException: Invalid index 79, size is 79
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
        at java.util.ArrayList.get(ArrayList.java:308)
        at edu.pacific.pocketrx.FlashCardFrag.onCreateView(FlashCardFrag.java:72)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
        at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:764)
        at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1562)
        at android.support.v4.app.FragmentManagerImpl$3.run(FragmentManager.java:495)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

删除片段的代码:

fragmentManager.popBackStack("tag1", 1);
ft = fragmentManager.beginTransaction();
ft.remove(fragmentManager.findFragmentByTag("tag1"));
ft.commit();
Run Code Online (Sandbox Code Playgroud)

And*_*tuk 5

实际上,片段管理器不存储您的隐藏片段,它仅存储状态

BackStackState类实现Parcelable

参见http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/support/v4/app/FragmentManager.java#FragmentManagerImpl.popBackStackState%28android。 os.Handler%2Cjava.lang.String%2Cint%2Cint%29

当您弹出片段时,片段管理器会尝试重新创建以前的视图以显示它。

参见moveToState方法

  • @veon,是否有一种方法可以只从堆栈中删除片段而无需重新创建前一个片段?如果我想一次删除多个片段,或者只想用一个新片段替换堆栈怎么办? (6认同)