Ich habe eine Android-App, wo ich eine Aktivität und einen Stapel von Fragmenten habe. NullPointerException bezogen auf FragmentManager.popBackStack. Wie löst man?
Crashlytics Verwendung, habe ich eine einzelne Instanz der folgenden Exception
erhalten:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.FragmentManager.popBackStack(java.lang.String, int)' on a null object reference
at com.company.app.Fragment$7$2.onClick(Fragment.java:397)
at android.view.View.performClick(View.java:5197)
at android.view.View$PerformClick.run(View.java:20926)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Der Code, der diesen Fehler erzeugt ist:
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
// The next line produces the Exception
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Other code...
}, 250);
}
});
Auf der Grundlage der Tests I mit dies getan haben App, der Benutzer, für den diese Ausnahme aufgetreten ist, und die Tatsache, dass es nur einmal aufgetreten ist, denke ich, dass diese Exception
auftritt, wenn einige seltsame Konsolidierung von Umständen auftritt. (Grundsätzlich kann ich das Exception
an meinem Ende nicht reproduzieren.) Ich gehe davon aus, dass dies mit dem Benutzer zu tun hat Hintergrund meiner App und dann zu einem späteren Zeitpunkt wieder aufnehmen, und dann der getFragmentManager()
Aufruf eine null
zurückgibt.
Also, ich weiß, dass ich dies mit Code wie folgt aus (fanden diese als angewandte Korrektur auf ein GitHub-Repository) „reparieren“ kann:
FragmentManager fm = getFragmentManager();
if (fm != null) fm.popBackStack();
Während ich erkennen, dass der obige Code „reparieren "Das Problem, dass es die NPE
vermeiden wird (damit die App nicht abstürzt)," repariert "es das Problem nicht wirklich, indem es meiner App erlaubt, wie gewünscht zu funktionieren. Die Fragment
in Frage # 3 in einem Stapel von Fragmenten, wie folgt aus:
#1 --> #2 --> #3
Das gewünschte Verhalten für die App ist durch knallen zurück zu Fragment
# 1 sichtbar auf diese Schaltfläche, um zu reagieren. Lediglich das Hinzufügen des obigen Codes scheint zu verhindern, dass die App abstürzt, ändert aber nicht die Benutzeroberfläche der App in der gewünschten Weise.
Was mache ich falsch, so dass, wenn meine App fortfährt, es "Fragment-Status" ist aus dem Gleichgewicht geraten?
Ich habe genau das gleiche Problem, ich rufe getFragmentManager(). PopBackStack() auf eine Schaltfläche, um das Fragment zu schließen und zum vorherigen zurückzukehren. Ich kann es auch nicht reproduzieren, aber der Bug ist häufig genug, um ein echtes Problem zu sein. –
ich stehe jetzt vor diesem problem hast du eine lösung ?? –