在 viewpager 片段中嵌套片段会抛出 IndexOutOfBoundsException
Nesting fragments inside a viewpager fragment throws IndexOutOfBoundsException
我正在使用包含 2 个片段的 viewPager。
第一个片段包含嵌套片段,第二个片段是空片段。
在第一个片段中,我使用子片段管理器嵌套了 4 个片段。
我的应用程序在运行时因 IndexOutOfBoundsException 而崩溃。
这是第一个片段的 onCreateView 方法
的代码
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
FragmentManager fragmentManager = getChildFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.frag1_container, frag1)
.commit();
fragmentManager.beginTransaction()
.add(R.id.frag2_container, frag2)
.commit();
fragmentManager.beginTransaction()
.add(R.id.frag3_container, frag3)
.commit();
fragmentManager.beginTransaction()
.add(R.id.frag4_container, frag4)
.commit();
return super.onCreateView(inflater, container, savedInstanceState);
}
这是异常的堆栈跟踪:
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 2
E/AndroidRuntime: at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
E/AndroidRuntime: at java.util.ArrayList.set(ArrayList.java:481)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.makeInactive(FragmentManager.java:1192)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1099)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1235)
E/AndroidRuntime: at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:710)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:458)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5292)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
找出导致错误的原因。
在我的一个片段中,我正在调用
getActivity().getSupportFragmentManager().beginTransaction().remove(instance).commit();
使用 Activity 的片段管理器而不是片段的子片段管理器。
因此出现此错误:
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 2
其中 3 是嵌套片段的索引,2 是 Activity 的片段管理器返回的大小。
通过使用片段中的片段管理器而不是 Activity 修复了它:
ThisFragment.this.getFragmentManager().beginTransaction().remove(instance).commit();
我正在使用包含 2 个片段的 viewPager。 第一个片段包含嵌套片段,第二个片段是空片段。 在第一个片段中,我使用子片段管理器嵌套了 4 个片段。 我的应用程序在运行时因 IndexOutOfBoundsException 而崩溃。
这是第一个片段的 onCreateView 方法
的代码 @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
FragmentManager fragmentManager = getChildFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.frag1_container, frag1)
.commit();
fragmentManager.beginTransaction()
.add(R.id.frag2_container, frag2)
.commit();
fragmentManager.beginTransaction()
.add(R.id.frag3_container, frag3)
.commit();
fragmentManager.beginTransaction()
.add(R.id.frag4_container, frag4)
.commit();
return super.onCreateView(inflater, container, savedInstanceState);
}
这是异常的堆栈跟踪:
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 2
E/AndroidRuntime: at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
E/AndroidRuntime: at java.util.ArrayList.set(ArrayList.java:481)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.makeInactive(FragmentManager.java:1192)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1099)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1235)
E/AndroidRuntime: at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:710)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:458)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5292)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
找出导致错误的原因。 在我的一个片段中,我正在调用
getActivity().getSupportFragmentManager().beginTransaction().remove(instance).commit();
使用 Activity 的片段管理器而不是片段的子片段管理器。
因此出现此错误:
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 2
其中 3 是嵌套片段的索引,2 是 Activity 的片段管理器返回的大小。
通过使用片段中的片段管理器而不是 Activity 修复了它:
ThisFragment.this.getFragmentManager().beginTransaction().remove(instance).commit();