2012-05-04 25 views
27

estoy usando la biblioteca de compatibilidad de Android y en ocasiones obtener un raro NullPointerException:NullPointerException en FragmentManager

java.lang.NullPointerException 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:960) 
    at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:768) 
    at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1104) 
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:410) 
    at android.support.v4.content.Loader.deliverResult(Loader.java:103) 
    at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:81) 
    at android.support.v4.content.CursorLoader.onStartLoading(CursorLoader.java:126) 
    at android.support.v4.content.Loader.startLoading(Loader.java:197) 
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.java:262) 
    at android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.java:710) 
    at android.support.v4.app.Fragment.onStart(Fragment.java:981) 
    at android.support.v4.app.Fragment.performStart(Fragment.java:1332) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906) 
    at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1240) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:612) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:804) 
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:433) 
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:405) 
    at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:386) 
    ... 

Obviamente, estoy haciendo algo equivocado permitir la FragmentManager para entrar en un estado donde puede fallar así, pero no tengo ni idea de qué. El relevant code en el FragmentManagerImpl no me ofrece ninguna pista. Supongo que mActivity es de alguna manera null en ese punto en el código? Pero eso parece imposible ya que la actividad ya está en la pantalla y no le estoy agregando ningún fragmento, simplemente cambiando entre ellos en un ViewPager.

+0

incluyen su código favor – Aidanc

+0

¿Qué código en particular, le gustaría ver? Nada de eso está en ningún lugar del rastro de la pila. – mlc

+1

todo? No podemos ayudarlo sin muestras de código. En la publicación mínima donde quiera que use el 'FragmentManager'. ¿El accidente ocurre cuando cambias los fragmentos? Publica el código de cómo cambias los fragmentos. etc. – edthethird

Respuesta

31

Bien chicos, después de golpear mi cabeza contra una pared de ladrillos por un tiempo en esto encontré que esto estaba directamente asociado con la declaración de mi fragmento de setRetainInstance(true). Después de eliminar esto, los problemas desaparecieron. Esto parece ser un error de la biblioteca de compatibilidad ...

Voy a plantear algo en el proyecto de Google apropiado. ¡La mejor de las suertes si estás leyendo esto lentamente sollozando para ti! Espero que esto te permita solucionar el problema.

+0

Recientemente encontré lo mismo, y estoy no usar FragmentManager en absoluto (solo crear instancias a través de xml). Solo me sucede en un dispositivo 2.3 con un teclado de hardware. Cuando cierro el teclado ... kaboom. – Mark

+0

+1. Se encontró con el mismo problema hoy :). Todo parecía estar bien hasta ese momento NPE @ 'FragmentManagerImpl.moveToState()' al cambiar entre fragmentos después de cambiar la orientación. :)))). JFYI sucedió en 4.1.1. –

+2

Realmente parece un error de lib de compatibilidad. ¿Lo has planteado en alguna parte? En caso afirmativo, enlace para que podamos votar sobre él. – Felix

0

En algún momento está utilizando una instancia de la clase FragmentManager, que no se ha inicializado. Encuentra ese punto e inicializa el objeto correctamente.

+1

Sí, eso lo resolvió para mí. Inicialice FragmentManager en onCreate() –

5

Tengo este error hace unos días y era bastante confundidos, pero me di cuenta de que era debido a una FragmentTransaction no parecía tener ninguna transacción pendiente por lo que cuando se llama a executePendingTransactions(); Un NPE tanto como éste fue arrojado.
Lo resolví asegurándome de que cada transacción realmente cambiara algo (es decir, agregar fragmento 1 -> eliminar fragmento 1 -> confirmar/ejecutar no funcionaría).
También asegúrese de que ninguno de los fragmentos en el localizador se haya convertido en null.

+0

. Solo intenté ejecutar executePendingTransactions repetidamente, y no conseguí que fallara, pero sigo teniendo estos bloqueos muy raramente sin saber por qué – marmor

0

Acabo de leer que no puede realizar ciertas transacciones en fragmentos que se agregaron en tiempo de compilación. Por ejemplo, si su Fragmento fue definido en XML e intenta reemplazarlo, boom.

-1

Resolví mi problema haciendo que mi FragmentManager como variable global estática, luego lo inicialicé en su método onCreate. Descubrí que el uso de getSupportFragmentManager() en todas partes del código puede dar como resultado esta excepción, ya que getSupportFragmentManager() puede apuntar a su antiguo valor del administrador de fragmentos y no se puede hacer referencia a ellas.

Aquí está un ejemplo:

public class yourClass{ 

     private static FragmentManager myFragmentManagerSupport; 
     ... 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
      myFragmentManagerSupport = this.getSupportFragmentManager(); 

       .... 

      } 

     /*Then reuse myFragmentManagerSupport everywhere you needed instead of 
     *      getSupportFragmentManager() 
     */ 

    } 

espero que ayude.

3

Me estaba dando el mismo error porque estaba haciendo referencia a una instancia de un fragmento en un adaptador de paginador de vista en lugar de que el fragmento en sí.

La creación de una nueva instancia del fragmento cada vez que se llamó al fragmento resolvió este error. Obviamente, esto es una adecuada programación pero por si acaso algunos otros noobs están haciendo el mismo error ....

@Override 
public Fragment getItem(int position) { 
    if(position == 0) 
     return new Walkthrough_Fragment_1(); 
    if(position == 1) 
     return new Walkthrough_Fragment_4(); 
    if(position == 2) 
     return new Walkthrough_Fragment_2(); 
    else{ 
     return new Walkthrough_Fragment_3(); 
    } 
} 
1

Este error se produce cuando se utiliza dentro de un Fragmento FragmentPagerAdapter que utilizan setRetainInstance(true).

Si desea mantener la setRetainInstance(true) puede utilizar @Marc respuesta de This question:

@Override 
public void restoreState(Parcelable arg0, ClassLoader arg1) { 
    //do nothing here! no call to super.restoreState(arg0, arg1); 
} 
Cuestiones relacionadas