FragmentManager уже выполняет транзакции после использования метода setOffscreenPageLimit ()

У меня есть ящик для навигации с несколькими фрагментами, и один из них представляет собой tablayout с двумя фрагментами recyclerview, элементы RecyclerView исчезают после переключения между фрагментами ящика для навигации, я нашел решение, которое мне нужно использовать метод setOffscreenPageLimit () с ViewPager, но Это дает мне ошибку, указанную в заголовке вопроса

Вот мой логарифм

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

Я столкнулся с подобной проблемой, как вы, после нескольких часов исследований, я нашел проблему. Если ваш ViewPager создан внутри Фрагмента, вам нужно использовать getChildFragmentManager () для FragmentPagerAdapter, а не getFragmentManager ().

Поэтому ваш метод setupViewPager () должен выглядеть так.

 private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); adapter.addFrag(new Courses(), "IT"); adapter.addFrag(new CoursesBussiness(), "Business"); viewPager.setAdapter(adapter); } 

Основная причина проблемы заключается в том, что вы встроили фрагменты внутри фрагмента, поэтому он будет генерировать исключение.

 java.lang.IllegalStateException: FragmentManager is already executing transactions 

Согласно документам Google:

Теперь вы можете вставлять фрагменты внутри фрагментов. Это полезно для различных ситуаций, в которых вы хотите разместить динамические и повторно используемые компоненты пользовательского интерфейса в компонент пользовательского интерфейса, который сам по себе является динамическим и может использоваться повторно. Например, если вы используете ViewPager для создания фрагментов, которые прокручиваются влево и вправо и потребляют большую часть пространства экрана, теперь вы можете вставлять фрагменты на каждую страницу фрагмента. Чтобы вставить фрагмент, просто вызовите getChildFragmentManager () на фрагменте, в который вы хотите добавить фрагмент. Это возвращает FragmentManager, который вы можете использовать, как обычно, из операции верхнего уровня для создания транзакций фрагментов.