试图说明当我弹回堆叠片段时调用onCreateView的原因。
使用以下代码:
fragmentManager.popBackStack("tag1", 1);
ft = fragmentManager.beginTransaction();
ft.remove(fragmentManager.findFragmentByTag("tag1"));
ft.commit();
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)
删除片段的代码:
fragmentManager.popBackStack("tag1", 1);
ft = fragmentManager.beginTransaction();
ft.remove(fragmentManager.findFragmentByTag("tag1"));
ft.commit();
答案 0 :(得分:5)
实际上片段管理器不会存储它只存储状态的隐藏片段
类BackStackState实现了Parcelable
当您弹出片段时,片段管理器会尝试重新创建以前的视图以显示它。
参见moveToState方法
答案 1 :(得分:-1)
更新:请忽略这个答案,这显然是错误的,我不知道我在说什么(这是3年前!)
原文(不正确)回答:
在我的情况下,我在后面的堆栈上有2个片段,称之为:
FragmentManager fm = activity.getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
似乎触发onCreateView()
即使对于顶部的当前片段也是如此令人困惑。我用popBackStackImmediate取代了它:
FragmentManager fm = activity.getSupportFragmentManager();
fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
现在没有为onCreateView()
调用顶部片段。
答案 2 :(得分:-1)
我遇到了同样的问题 - popBackStack()
或popBackStackImmediate()
正在调用片段的onCreateView
,这导致了一些问题,包括丢弃了Context。
对于我的情况,解决方案是将Fragment添加到backstack:
if (fragment instanceof BackStackFragment) transaction.addToBackStack(null);
这解决了我的问题,FragmentManager
停止创建视图。