668 votos

Diálogo tirar "no se puede agregar de la ventana - token null no es para una aplicación" con getApplication() como contexto

Mi Actividad está tratando de crear un AlertDialog que requiere de un Contexto como parámetro. Esto funciona como se esperaba si yo uso:

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

Sin embargo, estoy segura de usar "este" como un contexto debido a que el potencial de pérdidas de memoria cuando la Actividad es destruido y recreado incluso durante algo tan simple como una rotación de la pantalla. A partir de un post en el Android developer blog:

Hay dos maneras fáciles de evitar relacionados con el contexto pérdidas de memoria. La más obvia es evitar que se escape el contexto fuera de su propio ámbito. El ejemplo anterior se mostró el caso de una referencia estática, sino interior de las clases y su referencia implícita a la clase exterior puede ser igualmente peligroso. La segunda solución es utilizar el contexto de la Aplicación. Este contexto va a vivir tanto como su aplicación está viva y no dependen de las actividades del ciclo de vida. Si usted planea mantener de larga duración objetos que necesitan de un contexto, recordar el objeto de la aplicación. Usted puede obtener fácilmente llamando a Context.getApplicationContext() o Activity.getApplication().

Pero para el AlertDialog() ni getApplicationContext() o getApplication() es aceptable en un Contexto, como se produce la excepción: "no se puede agregar de la ventana - token null no es para una aplicación" según referencias: 1, 2, 3, etc.

Así, en caso de que esto realmente ser considerado un "error", ya que oficialmente se aconseja el uso de Activity.getApplication() y sin embargo, no funciona como se anuncia?

Jim

1359voto

Steven L Puntos 3892

En lugar de getApplicationContext(), sólo tiene que utilizar ActivityName.this.

194voto

TrueGuidance Puntos 1161

El uso de "this" no funciona para mí, pero "MyActivityName.this " . espero que esto ayuda a todos los que no se pudo obtener "this" para trabajar.

34voto

Kevin TeslaCoil Puntos 4273

El diálogo no debe ser un "objeto duradero que las necesidades de un contexto". La documentación es confuso. Básicamente, si usted hacer algo como:

static Dialog sDialog;

(nota : el estático)

A continuación, en una actividad en un lugar que hizo

 sDialog = new Dialog(this);

Lo más probable es que se fuga de la actividad original durante una rotación o similares, que iba a destruir la actividad. (A menos que limpiar onDestroy, pero en ese caso, usted probablemente no tendría el objeto de Diálogo estático)

Para algunas estructuras de datos tendría sentido para hacerlos estático y basado en la aplicación del contexto, pero en general no es para la interfaz de usuario de cosas relacionadas, como los cuadros de diálogo. Así que algo como esto:

Dialog mDialog;

...

mDialog = new Dialog(this);

Está muy bien y no pérdida de la actividad como mDialog se liberaría con la actividad ya no es estático.

20voto

P_Pran Puntos 136

En Activity en el clic de botón que muestra un cuadro de diálogo

Dialog dialog = new Dialog(MyActivity.this);

Trabajó para mí.

18voto

lassana Puntos 1551

Poco hack: puedes evitar la destrucción de la actividad por parte de la GC (por supuesto, usted no debe hacer, pero puede ayudar en algunas situaciones):

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();
    }
    ...
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X