Java.lang.IllegalStateException: Fragmento ya no existe para la clave f1: index 3
Quiero entender esta excepción para implementar una corrección adecuada.
Visión de conjunto:
- DialogFragment bloquea la aplicación en el cambio de orientación
- No se puede establecer la propiedad en un fragmento con varias instancias
- Deslizamiento de la lengüeta en el fragmento de mal funcionamiento desde la segunda vez
- La vista de Fragmento de ViewPager se pierde cuando el fragmento padre de ViewPager se oculta y luego se muestra
- ¿Se puede usar la etiqueta de combinación con fragmentos?
Hay un ViewPager y utiliza un FragmentStatePagerAdapter para instanciar 2 fragmentos vía getItem y MyFragmentClass.newInstance(...)
.
El getItem del adaptador tiene este aspecto:
@Override public Fragment getItem(int position) { Fragment fragment = null; switch(position) { case 0: fragment = MyFragment2.newInstance(par1); break; case 1: fragment = MyFragment2.newInstance(par2, par3); break; } return fragment; }
Problema:
Cuando la actividad se destruye, y se crea de nuevo, el adaptador se vuelve a intantiar, los fragmentos creados de nuevo con MyFragmentClass.newInstance(...)
… pero luego en esta línea:
pager.setAdapter(adapter);
Recibo la excepción mencionada.
Miré en la fuente donde se lanza la excepción, es esta:
@Override public Fragment getFragment(Bundle bundle, String key) { int index = bundle.getInt(key, -1); if (index == -1) { return null; } if (index >= mActive.size()) { throw new IllegalStateException("Fragement no longer exists for key " + key + ": index " + index); } Fragment f = mActive.get(index); if (f == null) { throw new IllegalStateException("Fragement no longer exists for key " + key + ": index " + index); } return f; }
Por lo tanto, se pasa un manojo allí, con algún estado que hace referencia a mis viejos fragmentos, pero esto no corresponde al estado actual ( mActive
), y la exceptio es arrojada.
No entiendo cuál es la idea detrás de esto, o de qué manera realmente se supone que instanciar los fragmentos … así que no tengo idea de cómo resolver.
También intenté un truco que obtuve de algún otro contexto:
pager.setOffscreenPageLimit(1);
Para evitar que los fragmentos sean destruidos cuando están fuera de la pantalla (en el caso de 2 páginas viewpager, aunque no sé si funciona bien con el adaptador de estado). Pero no parece estar relacionado, al menos, no ayuda, aún así obtener la misma excepción.
Lo que hice ahora es poner un bloque try catch alrededor de la línea, y bueno, entonces tengo páginas en blanco en lugar de una caja de choque, también no es bueno.
- Problemas de memoria en fragmentos que muestran imágenes
- OnBackStackChanged () se llama dos veces cuando se agrega nuevo fragmento en backstack
- java.lang.IllegalStateException: Actividad destruida - fragmento de Android
- No se puede resolver el método getContext () en android.support.v4.app.Fragment (versión 21.0.3) Android Studio
- Crear correctamente un fragmento en un PopupWindow
- Android FragmentTransaction commit ¿Cuándo?
- Instancia de apertura de la actividad
- Creación y uso de la vista de un fragmento aunque no sea visible para el usuario
Esto podría ayudar –
@Override public Parcelable saveState() { return null; }
Agregue la línea de arriba en FragmentStatePagerAdapter
.
Si no desea que los fragmentos se recuperen cuando están fuera de pantalla, debe utilizar FragmentPagerAdapter
y no FragmentStatePagerAdapter
.
Tengo lucha en este problema durante todo el día, pero ahora he encontrado la solución.
private ViewPager _mViewPager; _mViewPager.setOffscreenPageLimit(5); //5 is how much page you have.
setOffscreenPageLimit
Establece el número de páginas que deben conservarse en cualquier lado de la página actual en la jerarquía de vistas en un estado inactivo. Las páginas más allá de este límite se recrearán desde el adaptador cuando sea necesario.
muy bien ! Dado que es repetir pager.setAdapter(adapter);
Cuando llamada restoreState
causa excepción:
Fragment no longer exists for key f0: index 0
Podemos liberar el fragmento de RootView
public void onDestroyView() { super.onDestroyView(); if (isRecyclerRootViewAlways()) { mRootView = null;//<-- } mMyFragmentLifecycle.onFragmentDestroyView(this); }
- Java.lang.IllegalMonitorStateException: objeto no bloqueado por hilo antes de wait ()?
- ¿Por qué usar Enums en lugar de Constantes?