web-dev-qa-db-fra.com

ViewPager: entrée récursive pour exécuterPendingTransactions

J'ai un ViewPager dans un ViewPager et je reçois cette exception

09-07 18:30:26.392: ERROR/AndroidRuntime(841): FATAL EXCEPTION: main
    Java.lang.IllegalStateException: Recursive entry to executePendingTransactions
    at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1331)
    at Android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.Java:422)
    at Android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.Java:86)
    at Android.support.v4.view.ViewPager.populate(ViewPager.Java:453)
    at Android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.Java:563)
    at Android.view.View.dispatchAttachedToWindow(View.Java:7974)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1857)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1862)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1862)
    at Android.view.ViewGroup.addViewInner(ViewGroup.Java:2968)
    at Android.view.ViewGroup.addView(ViewGroup.Java:2824)
    at Android.support.v4.view.ViewPager.addView(ViewPager.Java:537)
    at Android.view.ViewGroup.addView(ViewGroup.Java:2781)
    at Android.view.ViewGroup.addView(ViewGroup.Java:2761)
    at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:848)
    at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1041)
    at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:616)
    at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1359)
    at Android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.Java:422)
    at Android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.Java:86)
    at Android.support.v4.view.ViewPager.populate(ViewPager.Java:453)
    at Android.support.v4.view.ViewPager.onAttachedToWindow(ViewPager.Java:563)
    at Android.view.View.dispatchAttachedToWindow(View.Java:7974)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1857)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1862)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1862)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1862)
    at Android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.Java:1862)
    at Android.view.ViewRoot.performTraversals(ViewRoot.Java:726)
    at Android.view.ViewRoot.handleMessage(ViewRoot.Java:1944)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:126)
    at Android.app.ActivityThread.main(ActivityThread.Java:3997)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:491)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:841)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:599)
    at dalvik.system.NativeStart.main(Native Method)

Je ne sais pas vraiment d'où vient cette erreur et je ne connais pas trop le FragmentManager. Dois-je vider les transactions ou quelque chose comme ça? Ou un viewPager dans un ViewPager est-il impossible? Et oui, je sais qu'il existe d'autres façons de le faire, mais je veux le snappness et le défilement gratuitement. J'aimerais aussi comprendre comment cela fonctionne réellement.

47
browep

Récemment, j'ai rencontré le même problème et après une petite enquête, j'ai été surpris de découvrir que vous ne pouvez tout simplement pas intégrer un fragment dans un autre. Ici, vous exécutez une transaction de fragment dans une autre. Ce n'est tout simplement pas autorisé.

La nouvelle version de Support Library v4 (ou Android 4.2, bien sûr) résout ce problème. Voir la réponse ci-dessous.

Mise à jourgetChildFragmentManager () ajouté pour résoudre le problème mentionné ci-dessus.

27
Dmitry Ryadnenko

La nouvelle version de Support Library v4 (ou Android 4.2, ofcourse) résout ce problème très simplement. Pour ce faire, faites simplement le constructeur de votre FragmentPagerAdapter personnalisé comme ceci:

public CustomFragmentPagerAdapter(Android.support.v4.app.Fragment fragment)
{
    super(fragment.getChildFragmentManager());

    // write your code here
}

Cela fonctionne parce que la nouvelle version Android approuve l'utilisation de fragments imbriqués

101
senneco

Référez-vous à ceci. Afficher le visualiseur de fragments dans un fragment

Cela peut être fait, mais cela doit être fait via un Asysnc car vous devez d'abord laisser la première transaction de fragments se terminer. Vous pouvez avoir des fragments dans des fragments. Je le sais parce que j'ai plusieurs projets qui le font.

7
Jack