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)
Miguel
fuente
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
Si usa el Servicio, lea stackoverflow.com/questions/23516689/… .
CoolMind

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);
Peter Knego
fuente
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" />
codezjx
fuente
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í;)

postNuKe
fuente
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í.

Priyank Joshi
fuente
¿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.

Dura
fuente
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{...
Matias
fuente
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
kontashi35
fuente
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

Anónimo-E
fuente
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.

soorya
fuente
0

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

Makvin
fuente
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

Ganesh Garad
fuente