android tutorial FragmentStatePagerAdapter IllegalStateException:<MyFragment> no se encuentra actualmente en FragmentManager




onattach android (6)

Las dos cosas clave para entender el error son:

  1. Sucede a veces .
  2. 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?

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 ...


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á.


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 ()));



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 .





fragment