Essayer de supprimer un fragment de la vue me donne une exception NullPointerException sur mNextAnim

J’ai 3 fragments, un NavigationDrawer, un MapFragment et un “MapInfoFragment” défini par l’utilisateur. Je souhaite que “MapInfoFragment” apparaisse semi-transparent par-dessus le MapFragment sur certains événements et disparaisse sur d’autres. Je ne m’inquiète pas vraiment si je supprime complètement le fragment et en crée un nouveau à chaque fois, ou si je modifie simplement la visibilité et les informations affichées. Actuellement, j’essaie juste d’utiliser la fonction .hide () de FragmentManager, mais j’ai aussi essayé .remove et .detach avec des résultats similaires.

Erreur:

03-18 14:28:10.965 24711-24711/com.[packageName].asTest D/AndroidRuntime﹕ Shutting down VM 03-18 14:28:10.965 24711-24711/com.[packageName].asTest E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.[packageName].asTest, PID: 24711 java.lang.NullPointerException: Attempt to write to field 'int android.app.Fragment.mNextAnim' on a null object reference at android.app.BackStackRecord.run(BackStackRecord.java:658) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 

Activity_main.xml:

         

Code offensant:

 FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.hide(getFragmentManager().findFragmentById(R.id.map_info)); ft.commit(); 

Mise à jour 1

J’ai changé map_info_layout à map_info et l’erreur que je reçois ne change pas. map_info_layout avait déjà map_info_layout défini comme identifiant de la racine FrameLayout du fichier XML d’agencement de MapInfoFragment. Je pense map_info_layout que map_info_layout et map_info la même chose.

Mise à jour 2: ma solution

Je me suis MapInfoFragment compte que MapInfoFragment étendait android.support.v4.app.Fragment au lieu de android.app.Fragment et que j’utilisais android.app.FragmentTransaction au lieu de android.support.v4.app.FragmentTransaction . Tout changé à android.app. comme je ne suis pas intéressé par la compatibilité des anciens appareils. Merci Fllo.

Mise à jour 3: solution générale

Arrêtez d’essayer de masquer des objects nuls

Je sais que vous avez résolu ce problème vous-même, mais je veux expliquer comment cette erreur s’est produite, car cela m’est arrivé.

Fondamentalement, vous appelez hide() , remove() , etc., avec une valeur nulle.

L’erreur n’est pas évidente, et la trace de la stack ne provient pas de vos propres sources lorsque cela se produit, il n’est donc pas sortingvial de comprendre ce que c’est.

Cela se produit également lorsque vous appelez FragmentManager.popBackstack() sans qu’il y ait un fragment dans le backstack.

C’est parce que vous ajoutez ou affichez ou masquez un fragment qui est nul maintenant, essayez de vérifier s’il est nul avant de l’utiliser!

Mon problème était que getFragments () de FragmentManager renvoie parfois une liste où certains fragments sont nuls et je supprimais ces fragments nuls.

Il m’est arrivé à moi seulement quand un des fragments dans le tiroir de navigation a montré un DialogFragment en utilisant

 newFragment.show(getFragmentManager(), "dialog"); 

Si au lieu de cela j’ai utilisé

 newFragment.show(getChildFragmentManager(), "dialog"); 

cela ne s’est pas passé.

REMARQUE: il ne m’a pas été causé par la panne lors de l’affichage ou de la fermeture de la boîte de dialog, mais lors de la modification d’un autre fragment du tiroir de navigation.

Appelez correctement show () et hide () …

  private void showFragment(int fragmentIndex, boolean addToBackStack) { FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); for (int i = 0; i < fragments.length; i++) { if (i == fragmentIndex) { transaction.show(fragments[i]); } else { transaction.hide(fragments[i]); } } if (addToBackStack) { transaction.addToBackStack(null); } transaction.commit(); }