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).
- Manejo del cambio de orientación con ViewPager + FragmentPagerAdapter
- ScrollView> LinearLayout> PreferenceFragment es altura cero
- RecyclerView no se actualiza después de NotifyDataSetChanged (), el contenido aparece después de encender y apagar la pantalla
- ListView dentro de un fragmento utilizado en un ViewPager no se comporta como se esperaba
- Reutilizando fragmentos en un fragmento
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 …
- Selecciona la imagen de la galería que no funciona en Fragment Class en Android
- Fragmento dentro de ViewPager devolver null en getView ()
- Cómo utilizar findViewById en fragmento y ArrayList no se puede aplicar - Android
- Reiniciar el fragmento dentro de la actividad
- Fragmentos en ViewPager se recrean
- Fragmento onResume () y problema de backStack
- El fragmento de niño está destruyendo automáticamente
- Cómo acceder al valor de edittext dentro de fragmento que está en un viewpager
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:
- A veces sucede.
- 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
- Color resuelto en lugar de un identificador de recurso
- Archivo de la biblioteca requerida no se puede leer o no es un archivo ZIP válido