Estoy tratando de abrir una ventana de diálogo, pero cada vez que intento abrirla arroja esta excepción:
Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at android.app.Activity.showDialog(Activity.java:2413)
Lo estoy creando llamando showDialog
con la identificación de la pantalla. El onCreateDialog
controlador se registra bien y puedo recorrerlo sin problemas, pero lo adjunto ya que parece que me falta algo:
@Override
public Dialog onCreateDialog(int id)
{
Dialog dialog;
Context appContext = this.getApplicationContext();
switch(id)
{
case RENAME_DIALOG_ID:
Log.i("Edit", "Creating rename dialog...");
dialog = new Dialog(appContext);
dialog.setContentView(R.layout.rename);
dialog.setTitle("Rename " + noteName);
break;
default:
dialog = null;
break;
}
return dialog;
}
¿Hay algo que falta en esto? Algunas preguntas han hablado acerca de tener este problema al crear un cuadro de diálogo onCreate
, lo que ocurre porque la actividad aún no se ha creado, pero esto proviene de una llamada de un objeto de menú y appContext
parece que la variable se rellena correctamente en el depurador.
No puede mostrar una ventana / diálogo de aplicación a través de un Contexto que no es una Actividad. Intenta pasar una referencia de actividad válida
fuente
activity.this
yactivity.getBaseContext()
no sirvió de nada. ¿Alguna ayuda?.this
.Lo mismo ocurre con el tema getApplicationContext.
Los documentos en el sitio de Android dicen que lo use, pero no funciona ... grrrrr :-P
Solo haz:
"esto" suele ser su actividad desde la que inicia el diálogo.
fuente
Los documentos de Android sugieren usar getApplicationContext ();
pero no funcionará en lugar de usar su actividad actual al crear instancias de AlertDialog.Builder o AlertDialog o Dialog ...
Ex:
o
fuente
En lugar de
getApplicationContext()
, solo useActivityName.this
fuente
Tuve un problema similar donde tuve otra clase algo como esto:
Funcionó bien la mayor parte del tiempo, pero a veces fallaba con el mismo error. Entonces me doy cuenta de que
MyActivity
tenía ...Debido a que estaba sosteniendo el objeto como
static
, una segunda ejecución del código todavía contenía la versión original del objeto y, por lo tanto, todavía se refería al originalActivity
, que ya no existía.Error tonto y estúpido, especialmente porque realmente no necesitaba estar sosteniendo el objeto como
static
en primer lugar ...fuente
Solo cámbielo a
En vez de
fuente
Otra solución es establecer el tipo de ventana en un cuadro de diálogo del sistema:
Esto requiere el
SYSTEM_ALERT_WINDOW
permiso:Como dicen los documentos:
Esta es una solución que solo debe usar si necesita un cuadro de diálogo que no esté asociado a una actividad.
fuente
No lo use
getApplicationContext()
para declarar dialougeSiempre use
this
o suactivity.this
fuente
Para los diálogos anidados, este problema es muy común, funciona cuando
se usa en lugar de
Esta alternativa.
fuente
Esto funcionó para mí
Utilizar
fuente
También puedes hacer esto
¡Esto funcionó para mí!
fuente
Como se dice, necesita una Actividad como contexto para el diálogo, use "YourActivity.this" para un contexto estático o verifique aquí cómo usar uno dinámico en un modo seguro
fuente
Intenta restablecer
dialog
el tipo de ventana aNo olvides usar el permiso
android.permission.SYSTEM_ALERT_WINDOW
fuente
Texto aquí:
use esto para obtener
activity
contexto paraprogressdialog
o
progressdialog = new ProgressDialog(this);
use esto para obtener el contexto de la aplicación para
BroadcastListener
no paraprogressdialog
.fuente
La mejor y más segura forma de mostrar un 'ProgressDialog' en una AsyncTask, evitando problemas de pérdida de memoria es usar un 'Handler' con Looper.main ().
luego en 'onCreate'
Ahora ha terminado con la parte de configuración. Ahora llame a 'showProgress ()' y 'hideProgress ()' en AsyncTask.
fuente