Android 'Fenster kann nicht hinzugefügt werden - Token Null ist nicht für eine Anwendung' Ausnahme

134

Ich erhalte die folgende Android-Ausnahme, wenn ich versuche, einen Dialog zu öffnen. Kann mir bitte jemand helfen zu verstehen, was los ist und wie ich dieses Problem beheben kann?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)
Michael
quelle
8
Wie sollen wir es wissen, ohne einen Code zu veröffentlichen?
Falmarri
1
Bitte beziehen Sie sich auf diese Antwort. Die Hauptsache, um den Link zu dieser Antwort zu posten, ist, dass es in den Kommentaren zu dieser Antwort eine nette Unterhaltung gibt, die beschreibt, warum dieses Problem auftritt und wie man am besten damit umgeht. Http://stackoverflow.com/a/ 7229248/501483
Dharam
Wenn Sie Service verwenden, lesen Sie stackoverflow.com/questions/23516689/… .
CoolMind

Antworten:

421

Ich vermute - versuchen Sie, einen Dialog mit einem Anwendungskontext zu erstellen? Etwas wie das:

new Dialog(getApplicationContext());

Das ist falsch. Sie müssen einen Aktivitätskontext verwenden.

Sie müssen versuchen wie:

new Dialog(YourActivity.this);
Peter Knego
quelle
1
Vielen Dank. Ich habe jedoch keinen neuen Dialog (getApplicationContext ()) verwendet. Ich benutze nur 'new AlertDialog.Builder (mContext);' Dabei ist mContext ein Verweis auf eine Aktivität.
Michael
10
Dann sollte mContext MyActivity.this sein.
Luis
10
Die Android-Dokumente ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) zum Erstellen eines benutzerdefinierten Dialogfelds weisen diesen Fehler auf. Kontext mContext = getApplicationContext (); Dialog dialog = neuer Dialog (mContext); Ihr Fix führt zu Dialog dialog = new Dialog (this); Welches funktioniert! Danke
bnieland
1
developer.android.com/guide/topics/ui/dialogs.html wurde behoben (seit einiger Zeit). Ich möchte nur darauf hinweisen. Das Muster wurde ebenfalls verbessert. :)
Martin Marconcini
2
Verwenden Sie getActivity()@SagarDevanga
Pratik Butani
34

Sie können weiterhin verwenden getApplicationContext(), aber vor der Verwendung sollten Sie dieses Flag hinzufügen: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)und der Fehler wird nicht angezeigt.

Und vergessen Sie nicht, die Erlaubnis hinzuzufügen:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
codezjx
quelle
Ja, das ist ganz einfach. Und vergessen Sie nicht, die Berechtigung hinzuzufügen, die ich gerade bearbeitet habe.
Codezjx
3
GetActivity () kann nicht in einem RecyclerAdapter verwendet werden
Martin Erlic
Das ist großartig :)
Syed Hamza Hassan
Wie fügt man die Flagge hinzu?
Conner Dassen
13

In meinem Fall habe ich versucht, meinen Dialog folgendermaßen zu erstellen:

new Dialog(getApplicationContext());

Also musste ich mich ändern für:

new Dialog(this);

Und es funktioniert gut für mich;)

postNuKe
quelle
1
Ihre Antwort ist korrekt, funktioniert jedoch nur, wenn Sie sich im Aktivitätsbereich befinden. Wenn Sie sich in einem inneren Bereich befinden, müssen Sie MyActivity.classanstelle von " thisweil this" auf ein anderes Objekt verweisen.
Shahar
1
Auch thiswird sicherstellen , dass Ihr Dialogerbt Ihr Thema.
TheRealChx101
12

Versuchen Sie es getParent()an der Argumentationsstelle von contextwie new AlertDialog.Builder(getParent());Hope, es wird funktionieren, es hat bei mir funktioniert.

Priyank Joshi
quelle
Warum getParent () verwenden? Was ist gemeint?
José Castro
2
Wenn Sie ein Dialogfeld in einer anderen Klasse anzeigen, das die Aktivitätsklasse nicht erweitert, erhalten Sie möglicherweise nicht den Kontext der Klasse, die die Aktivität erweitert. Um den Kontext in Ihrer Klasse zu erhalten, in dem Sie versuchen, den Dialog anzuzeigen, aber die Aktivität nicht zu erweitern, können Sie getParent () verwenden, das Ihnen den Kontext dieser übergeordneten Aktivität zurückgibt.
Priyank Joshi
1
Danke @PriyankJoshi, du hast meinen Tag gerettet, es löst auch die seltsame Ausnahme von "Android Fenster kann nicht hinzugefügt werden ist ungültig; läuft deine Aktivität?".
Eslam Yousef Mohammed
Wie könnte ich getParent () verwenden?
Vinidog
Danke dir! In meinem Fall hat es funktioniert. Ich habe angerufen this.parent.getActivity().getApplicationContext(), this.parent.getActivity()aber den Trick gemacht.
Carlodonz
3

Ich vermute - versuchen Sie, Dialog mit zu erstellen.

 getApplicationContext()
 mContext which is passed by activity.

Wenn Sie im Dialogfeld keine Aktivitätsklasse anzeigen, müssen Sie die Aktivität als Parameter übergeben.

Activity activity=YourActivity.this;

Jetzt wird es großartig funktionieren.

Wenn Sie Probleme haben, lassen Sie es mich wissen.

Harshid
quelle
2

Ich habe es damit im Kontextfeld versucht:

this.getActivity().getParent()

und es funktioniert gut für mich. Dies war aus einer Klasse, die sich von "Fragment" erstreckt:

public class filtro extends Fragment{...
Matias
quelle
2

Hallo, wenn Sie einen Adapter verwenden, besteht möglicherweise eine Chance.
Alles, was Sie wissen müssen, wenn Sie einen Dialog in Adapter, getContext (), Kontext oder Aktivität verwendet haben, wird irgendwann nicht mehr funktionieren.

Hier ist der Trick, den ich verwendet habe, v.getRootView().getContext() wobei v das Ansichtsobjekt ist, auf das Sie verweisen.
Z.B.


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class
kontashi35
quelle
Danke ! für meine kostbare Zeit gerettet !! (^_^)
Nizza umang
1

Ich habe die gleiche Ausnahme. Um dies zu beheben, übergebe ich die Instanz des Dialogs als Parameter an die Funktion und verwende sie, anstatt nur den Kontext zu übergeben, und verwende dann getContext (). Diese Lösung löst mein Problem, hoffe es kann helfen

Anonym-E
quelle
0

Ich habe diese Ausnahme erhalten, als ich versucht habe, den Fortschrittsdialog unter dem Cordova-Plugin zu öffnen, indem ich die folgenden zwei Fälle verwendet habe:

  1. neuer ProgressDialog (this.cordova.getActivity (). getParent ());

  2. neuer ProgressDialog (this.cordova.getActivity (). getApplicationContext ());

Später so geändert,

neuer ProgressDialog (this.cordova.getActivity ());

Es funktioniert gut für mich.

Soorya
quelle
0

Verwenden Sie dies und der Kontext hat bei mir nicht funktioniert. Aber MyActivityName. Dies hat funktioniert. Hoffe das hilft jedem, der es braucht.

Makvin
quelle
0

Ich habe diesen Fehler behoben, indem ich unten die Benutzerberechtigung in AndroidManifest.xml hinzugefügt habe

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Dialogfeld "Warnung initialisieren" mit Aktivitätsname:

AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);

Weitere Informationen finden Sie unter ==> So erstellen Sie einen Warnungsdialog in Android

Ganesh Garad
quelle