ViewPager: entrada recursiva para ejecutar transacciones pendientes

4 minutos de lectura

Tengo un ViewPager dentro de un ViewPager y obtengo esta excepción

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)

No estoy muy seguro de dónde proviene este error y no sé mucho sobre FragmentManager. ¿Necesito vaciar las transacciones o algo así? ¿O es imposible un viewPager dentro de un ViewPager? Y sí, sé que hay otras formas de hacer esto, pero quiero la agilidad y el desplazamiento gratis. También me gustaría entender cómo funciona realmente.

Nueva versión de Biblioteca de soporte v4 (o Android 4.2, por supuesto) resuelve este problema de forma muy sencilla. Para hacer esto, simplemente haga el constructor de su FragmentPagerAdapter personalizado de esta manera:

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

    // write your code here
}

Esto funciona porque la nueva versión de Android aprueba el uso de Fragmentos anidados

  • Esta debería ser la respuesta aceptada, el resto está desactualizado.

    – cómo

    8 de febrero de 2013 a las 19:54

  • Eres tan increíble, esto acaba de solucionar un problema en el que he pasado horas y horas. Tan simple y 4.2-fantástico.

    – Warpzit

    11 de febrero de 2013 a las 12:33

  • Debería obtener la respuesta correcta … De todos modos, +1 de mí. ¡Esto acaba de solucionar un problema que he tenido durante días!

    – Vinay S. Shenoy

    16 de febrero de 2013 a las 5:11

  • y cómo crearé su instancia a partir de la clase de actividad

    – Muhammed Refaat

    6 mayo 2014 a las 13:44

  • Por qué no podemos votar varias veces 🙂 (Y) para la solución

    – Ahmad Raza

    27 de mayo de 2014 a las 7:46

avatar de usuario
Dmitri Ryadnenko

Recientemente me encontré con el mismo problema y después de una pequeña investigación me sorprendió descubrir que simplemente no se puede incrustar un fragmento en otro. Aquí está ejecutando una transacción de fragmento en otra. Simplemente no está permitido.

La nueva versión de Support Library v4 (o Android 4.2, por supuesto) resuelve este problema. Vea la respuesta a continuación.

Actualizar
getChildFragmentManager () agregado para abordar el problema mencionado anteriormente.

  • Esto ya no es cierto, la última biblioteca de soporte agrega un Child FragmentManager que lo habilita.

    – Adán

    26 de noviembre de 2012 a las 18:31

  • debe actualizar su respuesta ya que todavía es la aceptada.

    – desgracia

    24 de junio de 2014 a las 18:48

avatar de usuario
Jacobo

Consulte esto. Mostrar visor de fragmentos dentro de un fragmento

Se puede hacer, pero se debe hacer a través de un Asysnc, ya que debe dejar que la transacción de los primeros fragmentos se complete primero. Puedes tener fragmentos dentro de fragmentos. Lo sé porque tengo varios proyectos haciéndolo.

  • Esto parece funcionar bien, use un controlador o AsyncTask para ejecutar PendingTransactions(), esto lo ejecutará después de que el fragmento principal haya terminado, es executePendingTransactions()

    – Águila de silicona

    28 de agosto de 2012 a las 9:06

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad