web-dev-qa-db-fra.com

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 lors de certains événements et disparaisse pour d'autres. Je ne me soucie pas vraiment de supprimer complètement le fragment et d'en créer un nouveau à chaque fois, ou de changer simplement la visibilité et les informations affichées. Actuellement, j'essaie simplement d'utiliser la fonction .hide () de FragmentManager, mais j'ai également 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:

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="com.[packageName].asTest.MainActivity">

    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
    <FrameLayout
        Android:id="@+id/container"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >

        <fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:map="http://schemas.Android.com/apk/res-auto"
            Android:id="@+id/map"
            Android:name="com.google.Android.gms.maps.MapFragment"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            map:cameraZoom="8"
            map:mapType="satellite"
            map:uiRotateGestures="false"
            Android:layout_gravity="center_horizontal|top"
        />
    </FrameLayout>

    <fragment Android:id="@+id/navigation_drawer"
        Android:layout_width="@dimen/navigation_drawer_width"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:name="com.[packageName].asTest.NavigationDrawerFragment"
        tools:layout="@layout/simple_list_item_1" />

    <fragment Android:id="@+id/map_info"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:name="com.[packageName].asTest.MapInfoFragment" />




</Android.support.v4.widget.DrawerLayout>

Code fautif:

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

Mise à jour 1

J'ai changé map_info_layout en map_info et l'erreur que je reçois ne change pas. J'avais précédemment défini map_info_layout en tant qu'id pour la racine FrameLayout de la mise en forme xml de MapInfoFragment. Je pense donc que map_info_layout et map_info pointaient vers la même chose.

Mise à jour 2: ma solution

Il s'est avéré que j'avais MapInfoFragment étendant Android.support.v4.app.Fragment au lieu de Android.app.Fragment et que j'utilisais le Android.app.FragmentTransaction au lieu de Android.support.v4.app.FragmentTransaction. Tout a basculé sur Android.app. puisque la compatibilité des anciens appareils ne m'intéresse pas. Merci beaucoup.

Mise à jour 3: solution générale

Arrête d'essayer de cacher des objets nuls

44
Koeber

Je sais que vous avez résolu le problème vous-même, mais je tiens à expliquer comment cette erreur se produit, car elle m'est simplement arrivée.

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

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

114
Gerald Kaszuba

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

8
Christine

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

5
howerknea

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

2
flobacca

Appelez show () et hide () correctement ...

    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();
}
0
Muhammad Etisam

Cela m'est arrivé seulement quand, à partir d'un des fragments du tiroir de navigation, j'ai montré un DialogFragment en utilisant 

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

Si à la place j'ai utilisé

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

ce n'est pas arrivé.

REMARQUE: le blocage ne m'est pas arrivé lors de l'affichage ou de la fermeture de la boîte de dialogue, mais lors du passage à un autre fragment du tiroir de navigation.

0
Andrea Aranguren