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:

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.

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); } 
  • Deshabilitar el botón positivo / negativo en DialogFragment
  • Obtener referencia al fragmento anidado de FragmentTabHost
  • ¿Es necesario establecer los oyentes de la interfaz Fragment a null en detach?
  • Detener fragmento de ser recreado después de reanudar?
  • Menú inflar llamadas varias veces en el fragmento onCreateOptionsMenu
  • Cómo implementar un ViewPager con diferentes Fragmentos / Layouts
  • Construir Reproducir Interfaz similar a la música
  • Android.app Fragments vs. android.support.v4.app usando ViewPager?
  • Acerca de Android Progress Dialog. ¿Evitar?
  • Trabajando con DIalogs en fragmentos
  • FragmentPagerAdapter getItem no está siendo activado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.