我有一个带有多个片段的导航抽屉,其中一个是带有两个recyclerview片段的tablayout,在导航抽屉片段之间切换后,RecyclerView项目消失了,我找到了一个解决方案,我需要使用方法setOffscreenPageLimit()和ViewPager但它给了我问题标题中提到的错误
这是我的logcat
java.lang.IllegalStateException: FragmentManager is already executing transactions at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1626) at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) at android.support.v4.view.ViewPager.populate(ViewPager.java:1240) at android.support.v4.view.ViewPager.populate(ViewPager.java:1088) at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:852) at com.amir.ahmed.EELUStudentUnion.SelectionFragment.setupViewPager(SelectionFragment.java:59) at com.amir.ahmed.EELUStudentUnion.SelectionFragment.onActivityCreated(SelectionFragment.java:40) at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2089) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1133) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7225) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
@Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager); setupViewPager(viewPager); viewPager.setOffscreenPageLimit(2); tabLayout = (TabLayout) getActivity().findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); setupTabIcons(); } private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager()); adapter.addFrag(new Courses(),"IT"); adapter.addFrag(new CoursesBussiness(),"Business"); viewPager.setAdapter(adapter); }
解决方法
我遇到了类似的问题,经过几个小时的研究,我发现了这个问题.
如果在Fragment中创建ViewPager,则需要对FragmentPagerAdapter使用getChildFragmentManager(),而不是getFragmentManager().
如果在Fragment中创建ViewPager,则需要对FragmentPagerAdapter使用getChildFragmentManager(),而不是getFragmentManager().
所以你的setupViewPager()方法应该是这样的.
private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); adapter.addFrag(new Courses(),"Business"); viewPager.setAdapter(adapter); }
问题的根本原因是你在Fragment中嵌入Fragments,这就是它抛出异常的原因.
java.lang.IllegalStateException: FragmentManager is already executing transactions
根据谷歌的文档:
You can now embed fragments inside fragments. This is useful for a variety of situations in which you want to place dynamic and re-usable UI components into a UI component that is itself dynamic and re-usable. For example,if you use ViewPager to create fragments that swipe left and right and consume a majority of the screen space,you can now insert fragments into each fragment page. To nest a fragment,simply call getChildFragmentManager() on the Fragment in which you want to add a fragment. This returns a FragmentManager that you can use like you normally do from the top-level activity to create fragment transactions.