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>
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!
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.
J'ai essayé de supprimer null du gestionnaire de fragments.
C'était le code actuel:
broadcastFragment = null;
getSupportFragmentManager().beginTransaction().remove(broadcastFragment).commit();
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
.
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.