web-dev-qa-db-fra.com

FragmentManager exécute déjà des transactions après avoir utilisé la méthode setOffscreenPageLimit ()

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

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.

21
Weidian Huang

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:

stackoverflow

0
Gourav Samre