web-dev-qa-db-fra.com

NullPointerException dans FragmentManager

J'utilise la bibliothèque de compatibilité Android et j'obtiens parfois un NullPointerException étrange:

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

Évidemment, je fais quelque chose mal pour permettre au FragmentManager d'entrer dans un tel état où il peut planter comme ça, mais je ne sais pas quoi. Le code pertinent dans le FragmentManagerImpl ne me donne aucun indice. Je suppose que mActivity est en quelque sorte null à ce stade du code? Mais cela semble impossible car l'activité est déjà à l'écran et je n'y ajoute aucun fragment - je change simplement entre eux dans un ViewPager.

28
mlc

Ok les gars, après m'être cogné la tête contre un mur de briques pendant un moment là-dessus, j'ai trouvé que cela était directement associé à la déclaration de mon fragment de setRetainInstance(true). Après avoir supprimé cela, les problèmes ont disparu. Cela semble être un bogue de bibliothèque de compatibilité ...

Je vais soulever quelque chose dans le cadre du projet Google approprié. Bonne chance si vous lisez lentement cette sobriété! J'espère que cela vous permettra de contourner le problème.

32
OceanLife

J'ai eu cette erreur il y a quelques jours et j'étais assez confus, mais j'ai compris que c'était parce qu'un FragmentTransaction ne semblait pas obtenir de transactions en attente, donc lors de l'appel de executePendingTransactions(); A NPE un peu comme celui-ci a été lancé.
Je l'ai résolu en m'assurant que chaque transaction changeait réellement quelque chose (par exemple, ajouter le fragment 1 -> supprimer le fragment 1 -> la validation/exécution ne fonctionnerait pas).
Assurez-vous également qu'aucun des fragments du pager n'est devenu null.

5
Jave

J'obtenais la même erreur parce que je référençais une instance d'un fragment dans un adaptateur de pageur de vue plutôt que le fragment lui-même.

La création d'une nouvelle instance du fragment à chaque appel du fragment a résolu cette erreur. Évidemment, c'est une bonne programmation, mais juste au cas où d'autres noobs feraient cette erreur ...

@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();
    }
}
3
MarcusM.

Ce bogue se produit lors de l'utilisation de FragmentPagerAdapter dans un fragment qui utilise setRetainInstance(true).

Si vous souhaitez conserver la setRetainInstance(true) vous pouvez utiliser la réponse @Marc de Cette question :

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

À un moment donné, vous utilisez une instance de la classe FragmentManager, qui n'est pas initialisée. Trouvez ce point et initialisez correctement l'objet.

0
Antony

Je viens de lire que vous ne pouvez pas effectuer certaines transactions sur des fragments qui ont été ajoutés au moment de la compilation. Par exemple, si votre fragment a été défini en XML et que vous essayez de le remplacer, boom.

0
MikeWallaceDev