Ich kann nicht verstehen, warum dies geschieht. Dieser Code:
mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);
funktioniert gut. Dieser Code jedoch:
mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);
löst die folgende Ausnahme aus:
W/WindowManager( 569): Attempted to add window with non-application token WindowToken{438bee58 token=null}. Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049): at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049): at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049): ... 11 more
Irgendwelche Ideen, warum das passiert? Ich rufe dies von der onCreate
Methode auf.
android
progressdialog
Felix
quelle
quelle
Fragment
, stackoverflow.com/questions/24825114/…Antworten:
Welche API-Version verwenden Sie? Wenn ich mit dem Problem Recht habe, wurde dies in Android 1.6 (API-Version 4) behoben.
Es sieht so aus, als ob die Objektreferenz,
getApplicationContext()
die zurückgibt, nur auf null zeigt. Ich denke, Sie haben ein ähnliches Problem wie ich, da ein Teil des Codes in ausgeführtonCreate()
wird, bevor das Fenster tatsächlich erstellt wird. Dies wird ein Hack sein, aber versuchen Sie, in wenigen hundert Millisekunden einen neuen Thread zu starten (IIRC: 300-400 schien für mich zu funktionieren, aber Sie müssen basteln), der Ihren ProgressDialog öffnet und alles andere startet, was Sie benötigen ( zB Netzwerk IO). Etwas wie das:quelle
Ich verwende Android Version 2.1 mit API Level 7. Ich bin mit diesem (oder einem ähnlichen) Problem konfrontiert und habe Folgendes gelöst:
an Stelle von:
Hoffe das hilft :)
quelle
Für mich hat sich verändert
zu
Seltsame Sache ist, dass die erste in Google Tutorial gefunden werden kann und die Leute Fehler in diesem Fall bekommen.
quelle
this
Alleine funktioniert nicht, wenn Sie dies beispielsweise in einem Klick-Listener tun.Ich denke nicht, dass dies ein Zeitproblem in einem Null-Anwendungskontext ist
Versuchen Sie, die Anwendung in Ihrer App zu erweitern (oder verwenden Sie sie einfach, wenn Sie dies bereits getan haben).
Stellen Sie die Instanz als privaten Singleton zur Verfügung. Dies ist niemals null
Erstellen Sie einen statischen Helfer in MyApp (der den Singleton verwendet).
BOOM!!
Schauen Sie sich auch die Antwort des Android-Ingenieurs hier an: WindowManager $ BadTokenException
Nun, ich stimme zu, es macht keinen Sinn, dass die Methode einen Kontextparameter anstelle von Aktivität verwendet.
quelle
Nachdem ich die obigen Antworten gelesen hatte, stellte ich fest, dass das Problem für meine Situation durch Folgendes behoben wurde.
Dies warf den Fehler
Basierend auf den vorherigen Antworten, die darauf hinwiesen, dass der Kontext der falsche war, habe ich getApplicationContext () geändert, um den Kontext aus der Ansicht abzurufen, die an die onClick-Methode der Schaltflächen übergeben wurde.
Ich verstehe die Funktionsweise von Java nicht vollständig, daher könnte ich mich irren, aber ich vermute, dass die Ursache für meine spezielle Situation mit der Tatsache zusammenhängen könnte, dass das obige Snippet in einer abstrakten Aktivitätsklasse definiert wurde. geerbt und von vielen Aktivitäten verwendet, hat das vielleicht dazu beigetragen, dass getApplicationContext () keinen gültigen Kontext zurückgibt? (Nur eine Vermutung).
quelle
Ich erstelle eine Kartenansicht mit detaillierten Überlagerungen. Ich habe mein Element-Overlay wie folgt aus meiner mapActivity erstellt:
Ich habe festgestellt, dass die Ausnahme "android.view.WindowManager $ BadTokenException: Fenster - Token null kann nicht für eine Anwendung hinzugefügt werden" angezeigt wird, wenn die onTap-Methode meines itemizedoverlay ausgelöst wurde (wenn der Speicherort in der Kartenansicht angetippt wird).
Ich stellte fest, dass das Problem behoben wurde, wenn ich einfach 'this' anstelle von 'getApplicationContext ()' an meinen Konstruktor übergab. Dies scheint die Schlussfolgerung von alienjazzcat zu stützen. seltsam.
quelle
Verwenden Sie für in TabActivities angezeigte Aktivitäten getParent ()
anstatt
quelle
Für Android 2.2
Verwenden Sie diesen Code:
anstelle dieses Codes:
Anmerkung: Mein benutzerdefinierter Dialog wird außerhalb der
activity.onCreateDialog(int dialogId)
Methode erstellt.quelle
Versuchen -
quelle
Hatte ein ähnliches Problem mit (Kompatibilität) Fragmente , bei dem ein unter Verwendung
getActivity()
innerhalbProgressDialog.show()
stürzt. Ich würde zustimmen, dass es am Timing liegt.Eine mögliche Lösung:
anstatt zu verwenden
Platzieren Sie den mContext so früh wie möglich, damit Sie mehr Zeit haben, den Kontext zu erfassen. Es gibt immer noch keine Garantie dafür, dass dies funktioniert. Es verringert lediglich die Wahrscheinlichkeit eines Absturzes. Wenn es immer noch nicht funktioniert, müssen Sie auf den Timer-Hack zurückgreifen (was andere Timing-Probleme verursachen kann, z. B. das spätere Schließen des Dialogfelds).
Wenn Sie
this
oder verwenden könnenActivityName.this
, ist es natürlich stabiler, weil esthis
bereits auf etwas hinweist. In einigen Fällen, wie bei bestimmten Fragment-Architekturen, ist dies jedoch keine Option.quelle
(Für zukünftige Referenzen)
Ich denke, das liegt daran, dass es Unterschiede im Anwendungskontext und im Aktivitätskontext gibt, wie hier erläutert: http://www.doubleencore.com/2013/06/context/
Dies bedeutet, dass wir keinen Dialog im Anwendungskontext anzeigen können. Das ist es.
quelle
Gehen Sie folgendermaßen vor, um Dialoge in Aktivitäten zu verwenden:
Gehen Sie folgendermaßen vor, um Dialoge in Fragmenten zu verwenden:
Das war's ^ _ ^
quelle
Um dies zu umgehen, habe ich eine Basisklasse für alle meine Aktivitäten erstellt, in der ich globale Daten speichere. In der ersten Aktivität habe ich den Kontext in einer Variablen in meiner Basisklasse wie folgt gespeichert:
Basisklasse
Erste Aktivität abgeleitet von der Basisklasse
Dann verwende ich beim Erstellen von Dialogen mycontext anstelle von getApplicationContext.
quelle
Wenn Sie ProgressDialog.show () in einem Fragment aufrufen, hat das Umwandeln des mContext in Aktivität für mich funktioniert.
quelle
Dies ist ein häufiges Problem. Verwenden Sie
this
stattdessengetApplicationContext()
Das sollte Ihr Problem lösenquelle
Ich habe den Warnungsdialog für Ausnahmen implementiert, die auf die aktuelle Aktivitätsansicht übertragen werden. Wann immer ich dies angegeben habe
Angesichts der gleichen Fensterausnahme. Ich schreibe Code für die Warnung aus onCreate (). So einfach, dass ich die
context = this;
after-setContentView()
Anweisung inonCreate()
method verwendet habe. Kontextvariable als global ähnlich genommenContext context;
Codebeispiel ist
Beispiel für eine Warnmethode ist
Es funktioniert gut für mich. Eigentlich habe ich bei StackOverflow nach diesem Fehler gesucht. Ich habe diese Abfrage gefunden. Nachdem ich alle Antworten dieses Beitrags gelesen hatte, habe ich es auf diese Weise versucht, damit es funktioniert. Ich dachte, dies ist eine einfache Lösung, um die Ausnahme zu überwinden.
Danke, Rajendar
quelle
Wenn Sie ein Problem mit groupActivity haben, verwenden Sie dieses nicht. PARENT ist eine statische Datei aus der übergeordneten Aktivitätsgruppe.
anstatt
quelle
Ein Dialog wird immer als Teil einer Aktivität erstellt und angezeigt. Sie müssen einen Aktivitätskontext anstelle des Anwendungskontexts übergeben.
http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog
quelle