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

2voto

Erwan Punkte 3687

Ich denke, es kann auch passieren, wenn Sie versuchen, ein Dialogfeld von einem Thread anzuzeigen, der nicht der Haupt-UI-Thread ist.

Utilisez runOnUiThread() in diesem Fall.

2voto

Martin Koubek Punkte 423

Eine andere Möglichkeit ist, den Dialog wie folgt zu erstellen:

final Dialog dialog = new Dialog(new ContextThemeWrapper(
            this, R.style.MyThemeDialog));

2voto

theWalker Punkte 2014

In meinem Fall Arbeit:

this.getContext();

1voto

Moses Wangira Punkte 148

Leute, ich habe einen einfachen Spickzettel. Erstellen Sie eine Datei, geben Sie ihr einen beliebigen Namen und schreiben Sie diesen Code hinein

fun Context.alertdialog(context: Context, msg: String, icon: Drawable, title:String){
    val alertDialog = AlertDialog.Builder(context)
    alertDialog.setIcon(icon)
        .setTitle(title)
        .setMessage(msg)
    alertDialog.show()
}

Wenn Sie nun einen Warndialog anzeigen müssen, verwenden Sie nur diese Methode

requireActivity().alertdialog(requireContext(), resources.getString(R.string.pass_title),
                resources.getDrawable(R.drawable.pass_ic_name), "title")

Goodluck für Kotlin

1voto

Bravo Punkte 97

Was bei mir funktioniert hat, war, die Aktivität statt des Kontexts zu übergeben.

Ich wollte ein benutzerdefiniertes Layout für mein Dialogfeld, aber um meinen Code getrennt zu halten, habe ich es in einer separaten Klasse erstellt, sonst müsste ich dieses Stück Code in jede Aktivität kopieren und einfügen, in der ich das Dialogfeld verwenden möchte.

Lösung erklärt meine Situation, aber es gibt die Kernlösung:

  1. Da ich einen ViewAdapter verwendet habe, habe ich den Adapter mit der Activity (nicht Kontext z.B. ->[kotlin] activity: Activity) als Parameter initialisiert -> z.B. [kotlin] this@MainActivity
  2. Dann habe ich diesen Parameter an den Viewholder übergeben
  3. Danach wird es wieder an die Klasse übergeben, die den Dialog aufbläst.

Verwenden Sie die Aktivität[optionaler Name]: Activity[obligatorischer Typ] überall, bis es zu dem Dialog kommt, den Sie aufblasen wollen

Es ist viel Herumprobieren, aber es macht mehr Sinn, als den gleichen Code überall zu kopieren und einzufügen.

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