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

6voto

MSA Punkte 2494

Utilisez MyDialog md = new MyDialog(MyActivity.this.getParent());

5voto

Engin OZTURK Punkte 2015

Versuchen Sie, den Kontext einer Aktivität zu verwenden, die sich unter dem Dialog befindet. Seien Sie jedoch vorsichtig, wenn Sie das Schlüsselwort "this" verwenden, da es nicht immer funktioniert.

Wenn Sie z.B. TabActivity als Host mit zwei Registerkarten haben, und jede Registerkarte ist eine andere Aktivität, und wenn Sie versuchen, einen Dialog von einer der Registerkarten (Aktivitäten) zu erstellen, und wenn Sie "this" verwenden, dann erhalten Sie eine Ausnahme, In diesem Fall sollte der Dialog mit der Host-Aktivität verbunden sein, die alles beherbergt und sichtbar ist. (Sie können sagen, die meisten sichtbaren Eltern Aktivität Kontext)

Ich habe diese Information nicht in einem Dokument gefunden, sondern durch Ausprobieren. Dies ist meine Lösung ohne starken Hintergrund, wenn jemand mit besserem Wissen, fühlen sich frei zu kommentieren.

5voto

DeniSHow Punkte 1387

Für künftige Leser sollte dies hilfreich sein:

public void show() {
    if(mContext instanceof Activity) {
        Activity activity = (Activity) mContext;
        if (!activity.isFinishing() && !activity.isDestroyed()) {
            dialog.show();
        }
    }
}

5voto

curlyreggie Punkte 1530

Wenn Sie ein Fragment verwenden und eine AlertDialog / Toast Nachricht, verwenden Sie getActivity() im Kontextparameter.

Hat bei mir funktioniert.

Zum Wohl!

3voto

Priyank Joshi Punkte 151

Versuchen Sie getParent() an der Argumentationsstelle des Kontextes wie new AlertDialog.Builder(getParent()); Ich hoffe, es funktioniert, bei mir hat es funktioniert.

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