j'ai un tiroir de navigation avec un certain nombre de fragments et l'un d'eux est un tablayout avec deux fragments de recyclerview, les éléments RecyclerView disparaissent après la commutation entre les fragments du tiroir de navigation. cela me donne le bogue mentionné dans le titre de la question
voici mon 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)
un qui est le code de fragment de mise en page onglet
@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);
}
Je rencontrais le même problème que vous. Après plusieurs heures de recherche, j’ai trouvé le problème… .. Si votre ViewPager est créé dans le fragment, vous devez utiliser getChildFragmentManager () pour le composant FragmentPagerAdapter plutôt que getFragmentManager ().
Ainsi, votre méthode setupViewPager () devrait ressembler à ceci.
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFrag(new Courses(), "IT");
adapter.addFrag(new CoursesBussiness(), "Business");
viewPager.setAdapter(adapter);
}
La cause fondamentale du problème est que vous avez incorporé des fragments dans le fragment, c’est la raison pour laquelle il lancera une exception.
Java.lang.IllegalStateException: FragmentManager is already executing transactions
Selon la documentation de Google:
Vous pouvez maintenant incorporer des fragments à l'intérieur de fragments. Ceci est utile pour un variété de situations dans lesquelles vous souhaitez placer dynamique et réutilisable Composants d'interface utilisateur dans un composant d'interface utilisateur qui est lui-même dynamique et réutilisable. Par exemple, si vous utilisez ViewPager pour créer des fragments qui balayez vers la gauche et la droite et utilisez la majorité de l’écran, vous peut maintenant insérer des fragments dans chaque page de fragment. Pour imbriquer un fragment, Il suffit d'appeler getChildFragmentManager () sur le fragment dans lequel vous vous trouvez vouloir ajouter un fragment. Cela retourne un FragmentManager que vous pouvez utilisez comme vous le faites normalement depuis l'activité de niveau supérieur pour créer fragmenter les transactions.
Essayez ceci cela a fonctionné pour moi:
Handler handler = new Handler();
handler.post(new Runnable()
{
@Override
public void run()
{
firstFragment(position);
}
});
pour plus d'informations, consultez ce lien: