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

18voto

Mikalai Daronin Punkte 8511

Kleiner Hack: Sie können verhindern, dass Ihre Aktivität durch GC zerstört wird (Sie sollten es nicht tun, aber es kann in einigen Situationen helfen. Vergessen Sie nicht, die Option contextForDialog à null wenn es nicht mehr benötigt wird):

public class PostActivity extends Activity  {
    ...
    private Context contextForDialog = null;
    ...
    public void onCreate(Bundle savedInstanceState) {
        ...
        contextForDialog = this;
    }
    ...
    private void showAnimatedDialog() {
        mSpinner = new Dialog(contextForDialog);
        mSpinner.setContentView(new MySpinner(contextForDialog));
        mSpinner.show();
    }
    ...
}

13voto

Muaaz Khalid Punkte 2080

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

wie diese

ProgressDialog pdialog;
pdialog = new ProgressDialog(getActivity());
pdialog.setCancelable(true);
pdialog.setMessage("Loading ....");
pdialog.show();

9voto

AlphaStack Punkte 127

Hinzufügen von

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

y

"android.permission.SYSTEM_ALERT_WINDOW"/> offenkundig

Bei mir funktioniert es jetzt. Nachdem sogar schließen und öffnen Sie die Anwendung, gab mir den Fehler zu dieser Zeit.

9voto

T.M Punkte 817

Ich benutzte ProgressDialog in einem Fragment und erhielt diesen Fehler bei der Übergabe getActivity().getApplicationContext() als Parameter für den Konstruktor. Ändern Sie ihn in getActivity().getBaseContext() hat auch nicht funktioniert.

Die Lösung, die bei mir funktioniert hat, war, die getActivity() ; d.h.

progressDialog = new ProgressDialog(getActivity());

6voto

oabareload Punkte 229

Wenn Sie außerhalb der Aktivität sind, dann müssen Sie in Ihrer Funktion "NameOfMyActivity.this" als Aktivität verwenden, Beispiel:

public static void showDialog(Activity activity) {
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setMessage("Your Message")
        .setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("No", dialogClickListener).show();
}

//Outside your Activity
showDialog(NameOfMyActivity.this);

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