FragmentStatePagerAdapter IllegalStateException: <MyFragment> no está actualmente en el FragmentManager

Estoy consiguiendo esto en algunos casos, en onResume (), de una actividad que utiliza un FragmentStatePagerAdapter. Cuando utilice el botón de retroceso del dispositivo. No siempre. No reproducible.

Estoy utilizando el paquete de soporte v4, la última revisión (8).

Ya buscado con google, no hay éxito en encontrar una respuesta útil.

Buscando en la fuente, se lanza aquí: FragmentManager.java

@Override public void putFragment(Bundle bundle, String key, Fragment fragment) { if (fragment.mIndex < 0) { throw new IllegalStateException("Fragment " + fragment + " is not currently in the FragmentManager"); } bundle.putInt(key, fragment.mIndex); } 

Pero ¿por qué está el índice del fragmento <0?

El código que instancia los fragmentos:

 @Override public Fragment getItem(int position) { Fragment fragment = null; switch(position) { case 0: fragment = MyFragment.newInstance(param1); break; case 1: fragment = MyFragment2.newInstance(param2, param3); break; } return fragment; } @Override public int getCount() { return 2; } 

También no puedo depurar a través de la fuente, ya que el paquete de soporte no me permite adjuntar la fuente, por alguna razón … pero eso es una pregunta diferente …

Si su ViewPager está distribuido dentro de un fragmento (no un activty):

MViewPager.setAdapter (nuevo MyFragmentStatePagerAdapter (obtener Child FragmentManager ()));

Tuve el mismo error aquí, pero por otra razón.

En mi caso tuve override getItemPosition en mi FragmentStatePagerAdapter. Mi ideia era devolver la posición, si el elemento existe, o un POSITION_NONE, si ya no existe.

Bueno, mi problema era el hecho de que cuando mi colección se vacía devolví POSITION_NONE. Y eso rompió todo.

Mi solución era devolver POSITION_UNCHANGED cuando tenía una colección vacía.

Espero que ayude a alguien más.

Las dos cosas clave para entender el error son:

  1. A veces sucede.
  2. Sucede en onResume() .

Dada esta información, es probable que ViewPager no retenga el estado de su Fragment . Si está manipulando el Fragment directamente desde la Activity , podría ser el caso de que el Fragment fuera de la página esté siendo destruido y su Activity esté tratando de manipular un fragmento null . Para conservar el estado del Fragment incluso cuando no está en la pantalla actual, la solución es bastante simple:

 private static final int NUM_ITEMS = 2; ViewPager mPager = /** instantiate viewpager **/; mPager.setOffscreenPageLimit(NUM_ITEMS-1); 

Usted puede leer sobre ello aquí:

ViewPager ¿Fragmentos que se destruyen con el tiempo?

Lo tengo, la razón era, que estoy intantiating el adaptador cada vez en onResume ().

Si instancia el adaptador una sola vez, en el ciclo de vida de la actividad, esto no sucede más.

Esta excepción significa que está intentando adjuntar un fragmento a una actividad que ya no es el estado correcto para adjuntar los fragmentos. Lo que significa es que cada vez que intentamos adjuntar fragmentos ( especialmente a través de una llamada asíncrona ), hay una pequeña probabilidad de que alguien haya presionado el botón Atrás y la actividad esté en combinación para ser destruida mientras se está adjuntando el fragmento. Esto no siempre es reproducible, ya que es sólo una condición de carrera, y no siempre puede ocurrir ..

Hay dos maneras de arreglar esto:

1) Esto sucede cuando el onSaveInstanceState de su actividad ha sido llamado y posteado al que está intentando adjuntar el fragmento, ya que android no podrá guardar el estado de su fragmento ahora, lanzará una excepción. Para superar esto y si no está guardando el estado de su fragmento, intente usar

CommitAllowingStateLoss () , mientras cometía la transacción.

2) Para ser muy seguro, compruebe si su actividad está en estado correcto o no antes de adjuntar el fragmento, use el siguiente código en onPause:

  boolean isInCorrectState; public void onCreate{ super.onCreate(); isInCorrectState = true; } public void onPause() { super.onPause(); if(isFinishing()){ isInCorrectState = false; } } 

Ahora utilice este indicador para comprobar si su actividad está en estado correcto o no antes de adjuntar el fragmento. Significado adjuntar el fragmento iff isInCorrectState == true .

Para mí la razón era otra cosa.

En mi Loader.onLoaderReset() los datos del adaptador. Cuando salía de la aplicación, onDestroy () provocó que el cargador se restableciera, lo que eliminó el FragmentStatePagerAdapter . Creo que hizo que el adaptador para borrar todas las referencias a sus fragmentos, pero de alguna manera, el FragmentManager no se dio cuenta y lanzó la excepción. No me parece muy lógico.

Tenga en cuenta que para mí sucedió Activity.onDestroy() .

Espero que ayude a alguien.

Fragmentos en el ViewPager son fijos, en lugar de intentar reemplazar los fragmentos en el adaptador, trate de dar un conjunto diferente de fragmentos y notifyDataSet cambiado, o tomar la ventaja de FrameLayout para mostrar otro fragmento sobre el fragmento actual de la pestaña paginador de vista.

No es mi solución que funciona:

Swipe Gesture aplicado al nivel de fragmento junto con ViewPager con su desplazamiento predeterminado desactivado

  • La carga de Google Maps es demasiado lenta en la aplicación de Android
  • El fragmento del explorador de código de barras de Zxing se bloquea después de unos minutos
  • Cómo pasar datos de un fragmento a un dialogFragment
  • Circular ViewPager. Fragmentos no funcionan como se suponía después de la primera ronda
  • Fragmento de acceso del adaptador
  • Reemplazar un fragmento mediante programación
  • Cómo guardar el estado del fragmento teniendo listview
  • YouTubePlayerFragment dentro de ReyclerView
  • Android Fragment, Force View para liberar manualmente
  • Inicialización del reproductor de YouTube en Fragmento
  • Cómo iniciarActivityForResult de Adapter para obtener el resultado de nuevo a Fragment
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.