47 votes

ViewPager : Entrée récursive dans executePendingTransactions

J'ai un ViewPager dans un ViewPager et j'obtiens 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 du genre ? Ou est-ce qu'un ViewPager dans un ViewPager est impossible ? Et oui, je sais qu'il existe d'autres moyens de faire cela, mais je veux l'accroche et le défilement gratuitement. J'aimerais également comprendre comment cela fonctionne réellement.

101voto

senneco Points 791

Nouvelle version de Bibliothèque de soutien v4 (ou Android 4.2, bien sûr) résout ce problème très simplement. Pour ce faire, il suffit de faire 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 d'Android approuve l'utilisation de fragments imbriqués.

27voto

nickes Points 5469

J'ai récemment rencontré le même problème et après une petite enquête, j'ai été surpris de découvrir qu'il est tout simplement impossible d'intégrer un fragment dans un autre. Ici, vous exécutez une transaction de fragment dans un 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 à jour getChildFragmentManager () ajouté pour résoudre le problème susmentionné.

7voto

Jack Points 96

Référez-vous à ceci. Afficher le viewpager du fragment dans un fragment

C'est possible, mais il faut le faire par le biais d'un Asysnc car il faut 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X