android - studio - FragmentStatePagerAdapter IllegalStateException:<MyFragment> no se encuentra actualmente en FragmentManager
navegar entre fragments android studio (7)
Entendido, la razón era que intantiaba el Adaptador cada vez en onResume ().
Si hago una instancia del adaptador solo una vez, en el ciclo de vida de la actividad, esto ya no sucederá.
Estoy obteniendo esto en algunos casos, en onResume (), de una actividad que utiliza un FragmentStatePagerAdapter. Cuando se utiliza el botón de retroceso del dispositivo. No siempre. No reproducible.
Estoy usando el paquete de soporte v4, última revisión (8).
Ya busqué en google, no tuve é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é el índice de fragmento es <0 ahí?
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;
}
Tampoco 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 esa es una pregunta diferente ...
Estas excepciones significan 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, cuando intentamos adjuntar fragmentos ( especialmente a través de una llamada asíncrona ), existe una pequeña probabilidad de que alguien haya presionado el botón Atrás y la actividad se fusione para ser destruida mientras se adjunta el fragmento. Esto no siempre es reproducible, ya que es solo una condición de carrera, y puede que no siempre ocurra.
Hay dos formas de solucionar esto:
1) Esto sucede cuando se llama al estado onSaveInstance de su actividad y se publica para que está intentando adjuntar el fragmento, ya que Android no podrá guardar el estado del fragmento ahora, producirá una excepción. Para superar esto y si no está guardando el estado de su fragmento, intente usar
commitAllowingStateLoss () , mientras se realiza la transacción.
2) Para estar muy seguro, verifique si su actividad está en el 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 use este indicador para verificar si su actividad está en el estado correcto o no antes de adjuntar el fragmento. Lo que significa que debe adjuntar el fragmento iff isInCorrectState == true .
Las dos cosas clave para entender el error son:
- Sucede a veces .
- Sucede en
onResume()
.
Dada esta información, es probable que ViewPager
no conserve el estado de sus Fragment
. Si está manipulando los Fragment
directamente desde la Activity
, podría ocurrir que el Fragment
fuera de página se destruya y su Activity
esté tratando de manipular un fragmento null
. Para mantener 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 ¿Los fragmentos se destruyen con el tiempo?
Los fragmentos en el ViewPager son fijos, en lugar de tratar de reemplazar los fragmentos en el adaptador, intente dar un conjunto diferente de fragmentos y notifiquemos DataDet cambiado, o aproveche la ventaja de FrameLayout para mostrar otro fragmento sobre el fragmento actual de la pestaña del visor de páginas.
Ahí está mi solución que funciona:
Para mi la razón era otra cosa.
En mi Loader.onLoaderReset()
los datos del adaptador. Cuando estaba abandonando la aplicación, onDestroy () hizo que el cargador se reiniciara, lo que eliminó el FragmentStatePagerAdapter
. Creo que causó que el adaptador borrara 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.
Si su ViewPager está diseñado dentro de un fragmento (no una actividad):
mViewPager.setAdapter (nuevo MyFragmentStatePagerAdapter (get Child FragmentManager ()));
Tuve el mismo error aquí, pero por otra razón.
En mi caso, tuve que anular getItemPosition en mi FragmentStatePagerAdapter. Mi idea era devolver la posición, si existe el elemento, o un POSITION_NONE, si ya no existe.
Bueno, mi problema fue el hecho de que cuando mi colección se vació, devolví POSITION_NONE. Y eso lo rompió todo.
Mi solución fue devolver POSITION_UNCHANGED cuando tenía una colección vacía.
Espero que ayude a alguien más.