web-dev-qa-db-fra.com

NullPointerException: tentative de lecture du champ 'int Android.app.Fragment.mContainerId' sur une référence d'objet null

Avoir un problème intéressant avec la transaction sur les fragments sur Android Lollipop SEULEMENT. Un crash se produit lorsque je retourne et supprime le fragment ajouté précédemment.

Voici stacktrace:

FATAL EXCEPTION: main
Process: com.parkme.consumer, PID: 15560
    Java.lang.NullPointerException: Attempt to read from field 'int Android.app.Fragment.mContainerId' on a null object reference
    at Android.app.BackStackRecord$1.onPreDraw(BackStackRecord.Java:1131)
    at Android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.Java:944)
    at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1970)
    at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1061)
    at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5885)
    at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:767)
    at Android.view.Choreographer.doCallbacks(Choreographer.Java:580)
    at Android.view.Choreographer.doFrame(Choreographer.Java:550)
    at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:753)
    at Android.os.Handler.handleCallback(Handler.Java:739)
    at Android.os.Handler.dispatchMessage(Handler.Java:95)
    at Android.os.Looper.loop(Looper.Java:135)
    at Android.app.ActivityThread.main(ActivityThread.Java:5254)
    at Java.lang.reflect.Method.invoke(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:372)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)

Comment je fais la transaction:

getFragmentManager().beginTransaction()
            .replace(R.id.list_holder, listFragment)
            .commit();

R.id.list_holder

<FrameLayout
        Android:id="@+id/list_holder"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">
</FrameLayout>

Comment je l'enlève:

 getFragmentManager().beginTransaction()
            .remove(listFragment)
            .commit();

Et je reçois le crash sur le dernier fragment de code. 

METTRE À JOUR

Après avoir enlevé, il n'y a plus de crash:

Transition slideTransition = TransitionInflater.from(ParkmeApplication.getContext()).inflateTransition(R.transition.slide_right);
setExitTransition(slideTransition);

slide_right: 

<transitionSet xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <slide
        Android:duration="@Android:integer/config_shortAnimTime"
        Android:slideEdge="right"/>
</transitionSet>
6
Magirus

La transaction avait pour but de ne pas utiliser la méthode getFragmentManager() et d'utiliser getSupportFragmentManager() à la place de la classe v4.app.Fragment. Une fois que j'ai quitté le Android.app.Fragment, cela fonctionne maintenant sans incident.

Donc, ma recommandation pour tous si vous avez de telles utilisations de getFragmentManager() et que vous avez des bibliothèques de support utilisées dans votre application, puis déplacez simplement vers le support manager. Même cela fonctionne pour vous. Ou vous pouvez frapper le crash avec un bug étrange comme je l'ai fait. Merci à tous ceux qui ont eu le temps de me donner des conseils! 

1
Magirus

J'avais cette erreur en faisant Fragment Transaction sur Fragment qui n'existe pas dans FragmentManager:

fragmentTransaction.hide(fragmentManager.findFragmentByTag("MyTag"));

Le fragment avec "MyTag" n'existe pas dans FragmentManager, donc FragmentTransaction essaie de faire le travail sur un fragment nul.

2
Jemshit Iskenderov

J'ai essayé de supprimer null du gestionnaire de fragments.

C'était le code actuel:

broadcastFragment = null;
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit();
0
app developer 27

J'ai eu un problème similaire et j'avais tort d'appeler addToBackStack() lors de l'ajout du premier fragment à la mise en page. Après l'avoir retiré, cela fonctionne bien. Il est évident que cela fonctionne dans les niveaux Android supérieurs tels que O.

0
Pei

La fonction replace supprime les fragments ajoutés précédemment dans R.id.list_holder et les ajoute au nouveau fragment. Ainsi, lorsque vous supprimez votre fragment, le système ne peut pas le trouver car il a déjà été supprimé par la fonction de remplacement.

0
Viven