Ich versuche, ein Dialogfenster zu öffnen, aber jedes Mal, wenn ich versuche, es zu öffnen, wird folgende Ausnahme ausgelöst:
Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at android.app.Activity.showDialog(Activity.java:2413)
Ich erstelle es, indem ich showDialog
mit der ID des Displays anrufe. Der onCreateDialog
Handler protokolliert einwandfrei und ich kann ihn problemlos durchgehen, aber ich habe ihn angehängt, da mir anscheinend etwas fehlt:
@Override
public Dialog onCreateDialog(int id)
{
Dialog dialog;
Context appContext = this.getApplicationContext();
switch(id)
{
case RENAME_DIALOG_ID:
Log.i("Edit", "Creating rename dialog...");
dialog = new Dialog(appContext);
dialog.setContentView(R.layout.rename);
dialog.setTitle("Rename " + noteName);
break;
default:
dialog = null;
break;
}
return dialog;
}
Fehlt etwas daran? In einigen Fragen wurde über dieses Problem beim Erstellen eines Dialogfelds gesprochen onCreate
, das auftritt, weil die Aktivität noch nicht erstellt wurde, dies jedoch aus einem Aufruf eines Menüobjekts stammt und die appContext
Variable im Debugger korrekt ausgefüllt zu sein scheint.
Sie können ein Anwendungsfenster / -dialogfeld nicht über einen Kontext anzeigen, der keine Aktivität ist. Versuchen Sie, eine gültige Aktivitätsreferenz zu übergeben
quelle
activity.this
undactivity.getBaseContext()
aber ohne Erfolg. Irgendeine Hilfe?.this
.Das Gleiche gilt für die Sache getApplicationContext.
Die Dokumente auf der Android-Site sagen, dass sie es verwenden sollen, aber es funktioniert nicht ... grrrrr :-P
Mach einfach:
"this" ist normalerweise Ihre Aktivität, von der aus Sie den Dialog starten.
quelle
In Android-Dokumenten wird empfohlen, getApplicationContext () zu verwenden.
Stattdessen funktioniert es jedoch nicht. Verwenden Sie Ihre aktuelle Aktivität, während Sie AlertDialog.Builder oder AlertDialog oder Dialog instanziieren.
Ex:
oder
quelle
getApplicationContext()
Verwenden Sie stattdessen einfachActivityName.this
quelle
Ich hatte ein ähnliches Problem, bei dem ich eine andere Klasse wie diese hatte:
Hat die meiste Zeit gut funktioniert, aber manchmal ist es mit dem gleichen Fehler abgestürzt. Dann merke ich, dass
MyActivity
ich in ...Da ich das Objekt als hielt
static
, enthielt ein zweiter Lauf des Codes immer noch die Originalversion des Objekts und bezog sich daher immer noch auf das OriginalActivity
, das nicht mehr existierte.Dummer dummer Fehler, zumal ich das Objekt wirklich nicht wie
static
an erster Stelle halten musste ...quelle
Ändern Sie es einfach in
Anstatt
quelle
Eine andere Lösung besteht darin, den Fenstertyp auf einen Systemdialog festzulegen:
Dies erfordert die
SYSTEM_ALERT_WINDOW
Erlaubnis:Wie die Dokumente sagen:
Dies ist eine Lösung, die Sie nur verwenden sollten, wenn Sie einen Dialog benötigen, der nicht an eine Aktivität angehängt ist.
quelle
Nicht
getApplicationContext()
zum Deklarieren von Dialouge verwendenVerwenden
this
Sie immer oder Ihreactivity.this
quelle
Bei verschachtelten Dialogen tritt dieses Problem häufig auf. Es funktioniert, wenn
wird anstelle von verwendet
diese Alternative.
quelle
Das hat bei mir funktioniert ...
Verwenden
quelle
Sie können dies auch tun
Das hat bei mir funktioniert !!
quelle
Wie bereits erwähnt, benötigen Sie eine Aktivität als Kontext für den Dialog. Verwenden Sie "YourActivity.this" für einen statischen Kontext oder prüfen Sie hier, wie Sie eine dynamische Aktivität im abgesicherten Modus verwenden können
quelle
Versuchen Sie, den
dialog
Fenstertyp auf zurückzusetzenVergessen Sie nicht, die Erlaubnis zu verwenden
android.permission.SYSTEM_ALERT_WINDOW
quelle
Text hier: -
Verwenden Sie dies, um den
activity
Kontext für zu erhaltenprogressdialog
oder
progressdialog = new ProgressDialog(this);
Verwenden Sie diese Option, um den Anwendungskontext für
BroadcastListener
nicht für abzurufenprogressdialog
.quelle
Der beste und sicherste Weg, einen 'ProgressDialog' in einer AsyncTask anzuzeigen, um Speicherverlustprobleme zu vermeiden, ist die Verwendung eines 'Handlers' mit Looper.main ().
dann in der 'onCreate'
Jetzt sind Sie mit dem Setup-Teil fertig. Rufen Sie nun in asyncTask 'showProgress ()' und 'hideProgress ()' auf.
quelle