696 Stimmen

Dialog mit der Meldung "Fenster kann nicht hinzugefügt werden - Token null ist nicht für eine Anwendung" mit getApplication() als Kontext

Meine Aktivität versucht, einen AlertDialog zu erstellen, der einen Kontext als Parameter erfordert. Dies funktioniert wie erwartet, wenn ich verwenden:

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

Allerdings bin ich misstrauisch bei der Verwendung von "this" als Kontext aufgrund des Potenzials für Speicherlecks, wenn Aktivität zerstört und neu erstellt wird, auch während etwas Einfaches wie eine Bildschirmdrehung. Von einer zugehöriger Beitrag im Blog der Android-Entwickler :

Es gibt zwei einfache Möglichkeiten, um kontextbezogene Speicherlecks zu vermeiden. Die offensichtlichste besteht darin, den Kontext nicht außerhalb seines eigenen Bereichs zu lassen. Das obige Beispiel zeigt den Fall einer statischen Referenz, aber innere Klassen und ihre implizite Referenz auf die äußere Klasse können ebenso gefährlich sein. Die zweite Lösung besteht darin, den Anwendungskontext zu verwenden. Dieser Kontext lebt so lange, wie Ihre Anwendung existiert und ist nicht vom Lebenszyklus der Aktivitäten abhängig. Wenn Sie planen, langlebige Objekte zu behalten, die einen Kontext benötigen, sollten Sie sich das Anwendungsobjekt merken. Sie können es leicht erhalten, indem Sie Context.getApplicationContext() oder Activity.getApplication() aufrufen.

Aber für die AlertDialog() weder getApplicationContext() o getApplication() ist als Context akzeptabel, da er die Ausnahme auslöst:

"Fenster kann nicht hinzugefügt werden - Token Null ist nicht für eine Anwendung"

nach Referenzen: 1 , 2 , 3 , usw.

Sollte dies also wirklich als "Fehler" betrachtet werden, da uns offiziell empfohlen wird, die Activity.getApplication() und trotzdem funktioniert es nicht wie versprochen?

Jim

28voto

Mahmoud Ayman Punkte 1135

In Tätigkeit einfach benutzen:

MyActivity.this

in Fragment:

getActivity();

26voto

Grux Punkte 574

Ich musste meinen Kontext durch einen Konstruktor auf einem benutzerdefinierten Adapter in einem Fragment angezeigt senden und hatte dieses Problem mit getApplicationContext(). Ich löste es mit:

this.getActivity().getWindow().getContext() in den Fragmenten onCreate Rückruf.

22voto

MilaDroid Punkte 1201

***** kotlin version *****

Sie sollten bestehen this@YourActivity 代わりに applicationContext o baseContext

20voto

P_Pran Punkte 211

En Activity beim Anklicken der Schaltfläche wird ein Dialogfeld angezeigt

Dialog dialog = new Dialog(MyActivity.this);

Hat bei mir funktioniert.

19voto

Muhammad Faizan Punkte 1759

Verwenden Sie einfach Folgendes:

FÜR JAVA-BENUTZER

Falls Sie die Aktivität --> AlertDialog.Builder builder = new AlertDialog.Builder(this);

OR

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

Falls Sie Fragmente verwenden --> AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

FÜR KOTLIN-BENUTZER

Falls Sie die Aktivität --> val builder = AlertDialog.Builder(this)

OR

val builder = AlertDialog.Builder(this@your_activity.this)

Falls Sie Fragmente verwenden --> val builder = AlertDialog.Builder(activity!!)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X