Android 'No se puede agregar la ventana - token nulo no es para una aplicación' excepción


134

Recibo la siguiente excepción de Android cuando intento abrir un cuadro de diálogo. ¿Alguien puede ayudarme a comprender lo que está sucediendo y cómo puedo solucionar este problema?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

8
¿Cómo se supone que debemos saber sin publicar algún código?
Falmarri


1
Consulte esta respuesta, lo principal para publicar el enlace de esta respuesta es que hay una buena conversación en los comentarios sobre esta respuesta que describen por qué se presenta este problema y cuál es la mejor manera de abordarlo http://stackoverflow.com/a/ 7229248/501483
dharam

Respuestas:


421

Supongo que ¿estás intentando crear un diálogo con un contexto de aplicación? Algo como esto:

new Dialog(getApplicationContext());

Esto está mal. Debe usar un contexto de actividad.

Tienes que probar como:

new Dialog(YourActivity.this);

1
Gracias. Pero no utilicé el nuevo Diálogo (getApplicationContext ()); Solo uso 'new AlertDialog.Builder (mContext);' donde mContext es un referente para una actividad.
Michael

10
Entonces mContext debería ser MyActivity.this.
Luis

10
Los documentos de Android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) para crear un diálogo personalizado tienen este error. Contexto mContext = getApplicationContext (); Diálogo de diálogo = nuevo diálogo (mContext); Su solución lleva al cuadro de diálogo Diálogo = nuevo Diálogo (esto); Que funciona! Gracias
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html se ha solucionado (desde hace un tiempo). Solo señalando esto como referencia. El patrón también se ha mejorado. :)
Martin Marconcini

2
Use getActivity()@SagarDevanga
Pratik Butani

34

Puede continuar usándolo getApplicationContext(), pero antes de usarlo, debe agregar este indicador: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)y el error no aparecerá.

Y no olvides agregar permiso:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Si, es bastante simple. Y no olvides agregar permiso, lo edité ahora mismo.
codezjx

3
No se puede usar getActivity () en un RecyclerAdapter
Martin Erlic

Eso es increíble :)
Syed Hamza Hassan

¿Cómo se agrega la bandera?
Conner Dassen

13

En mi caso, estaba tratando de crear mi diálogo así:

new Dialog(getApplicationContext());

Entonces tuve que cambiar por:

new Dialog(this);

Y funciona bien para mí;)


1
Su respuesta es correcta, sin embargo, solo funcionará cuando esté dentro del alcance de la actividad. Si está en un ámbito interno, debe usarlo en MyActivity.classlugar de thisporque se thisrefiere a un objeto diferente.
Shahar

1
Además, thisse asegurará de que tu Dialogherede tu tema.
TheRealChx101

12

Tratar getParent()en el lugar del argumento contextcomo new AlertDialog.Builder(getParent());la esperanza de que funcione, que trabajó para mí.


¿Por qué usar getParent () ?, ¿qué significa?
José Castro

2
Cuando muestra un cuadro de diálogo en otra clase que no extiende la clase Actividad, por lo tanto, es posible que no obtenga el contexto de esa clase que extiende la Actividad. Entonces, para obtener el contexto dentro de su clase donde está tratando de mostrar el diálogo pero sin extender la Actividad, puede usar getParent () que le devuelve el contexto de esa actividad superior.
Priyank Joshi

1
Gracias @PriyankJoshi, me salvaste el día, también resuelve la extraña excepción de "Android No se puede agregar la ventana no es válida; ¿se está ejecutando tu actividad?".
Eslam Yousef Mohammed

¿Cómo puedo usar getParent ()?
vinidog

¡Gracias! Funcionó en mi caso. Estaba llamando this.parent.getActivity().getApplicationContext()pero this.parent.getActivity()hice el truco.
carlodonz

3

Supongo que estás intentando crear un diálogo usando.

 getApplicationContext()
 mContext which is passed by activity.

si muestra una clase de diálogo sin actividad, debe pasar la actividad como parámetro.

Activity activity=YourActivity.this;

Ahora será un gran trabajo.

Si encuentra algún problema, hágamelo saber.


2

Intenté con esto en el campo de contexto:

this.getActivity().getParent()

y funciona bien para mi Esto era de una clase que se extiende desde "Fragmento":

public class filtro extends Fragment{...

2

Hola, si está utilizando un adaptador, puede haber una posibilidad.
Todo lo que necesita saber cuando utilizó un cuadro de diálogo en el adaptador, getContext (), contexto o actividad no funcionará alguna vez.

Aquí está el truco que utilicé v.getRootView().getContext() donde v es el objeto de vista al que hace referencia.
P.ej.


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

Gracias ! por ahorrado mi precioso tiempo !! (^_^)
Buen día el

1

Tengo la misma excepción. lo que hago para solucionar esto es pasar la instancia del diálogo como parámetro a la función y usarla en lugar de pasar solo el contexto y luego usar getContext (). Esta solución resuelve mi problema, espero que pueda ayudar


0

Obtuve esta excepción, cuando intenté abrir el Diálogo de progreso en Cordova Plugin usando los siguientes dos casos,

  1. nuevo ProgressDialog (this.cordova.getActivity (). getParent ());

  2. nuevo ProgressDialog (this.cordova.getActivity (). getApplicationContext ());

Más tarde cambió así,

nuevo ProgressDialog (this.cordova.getActivity ());

esta trabajando bien para mi.


0

Use esto y el contexto no funcionó para mí ... pero MyActivityName.Eso funcionó. Espero que esto ayude a cualquiera que lo necesite.


0

Resolví este error agregando a continuación el permiso de usuario en AndroidManifest.xml

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Además, inicie el cuadro de diálogo Alerta con el nombre de la actividad:

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

Para obtener más detalles, visite ==> Cómo crear un cuadro de diálogo de alerta en Android

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.