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

У меня есть ящик для навигации с несколькими фрагментами, и один из них представляет собой tablayout с двумя фрагментами recyclerview, элементы 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)

a, то есть фрагмент фрагмента макета вкладки

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

Ответ 1

Я столкнулся с подобной проблемой, как вы, после нескольких часов исследований, я нашел проблему. Если ваш 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, который вы можете использовать, как обычно, из деятельности верхнего уровня, чтобы создать фрагмент транзакций.

Ответ 2

Попробуйте, это сработало для меня:

Handler handler = new Handler();
handler.post(new Runnable()
{
    @Override
 public void run()
{
 firstFragment(position);
}
});

для получения дополнительной информации проверьте эту ссылку:

переполнение стека