J'essaie d'ouvrir une fenêtre de dialogue, mais chaque fois que j'essaye de l'ouvrir, elle lance cette exception:
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)
Je le crée en appelant showDialog
avec l'ID de l'affichage. Le onCreateDialog
gestionnaire se connecte correctement et je peux le parcourir sans problème, mais je l'ai joint car il semble que je manque quelque chose:
@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;
}
Y a-t-il quelque chose qui manque à cela? Certaines questions ont évoqué ce problème lors de la création d'une boîte de dialogue à partir de onCreate
, ce qui se produit car l'activité n'est pas encore créée, mais cela provient d'un appel à partir d'un objet de menu, et la appContext
variable semble être correctement remplie dans le débogueur.
Vous ne pouvez pas afficher une fenêtre / boîte de dialogue d'application via un contexte qui n'est pas une activité. Essayez de transmettre une référence d'activité valide
la source
activity.this
et enactivity.getBaseContext()
vain. De l'aide?.this
.Idem sur la chose getApplicationContext.
Les documents sur le site Android disent de l'utiliser, mais cela ne fonctionne pas ... grrrrr :-P
Faites juste:
"ceci" est généralement votre activité à partir de laquelle vous démarrez la boîte de dialogue.
la source
Les documents Android suggèrent d'utiliser getApplicationContext ();
mais cela ne fonctionnera pas au lieu d'utiliser cette activité lors de l'instanciation d'AlertDialog.Builder ou AlertDialog ou Dialog ...
Ex:
ou
la source
Au lieu de
getApplicationContext()
, utilisez simplementActivityName.this
la source
J'ai eu un problème similaire où j'avais une autre classe quelque chose comme ça:
A bien fonctionné la plupart du temps, mais parfois il s'est écrasé avec la même erreur. Ensuite, je me rends compte que
MyActivity
j'avais en ...Parce que je tenais l'objet en tant que
static
, une deuxième exécution du code contenait toujours la version originale de l'objet, et faisait donc toujours référence à l'originalActivity
, qui n'existait plus.Erreur stupide et stupide, d'autant plus que je n'avais vraiment pas besoin de tenir l'objet comme
static
en premier lieu ...la source
Il suffit de le changer en
Au lieu de
la source
Une autre solution consiste à définir le type de fenêtre sur une boîte de dialogue système:
Cela nécessite l'
SYSTEM_ALERT_WINDOW
autorisation:Comme le disent les docs:
Il s'agit d'une solution que vous ne devez utiliser que si vous avez besoin d'une boîte de dialogue qui n'est pas attachée à une activité.
la source
Ne pas utiliser
getApplicationContext()
pour déclarer dialougeUtilisez toujours
this
ou votreactivity.this
la source
Pour les boîtes de dialogue imbriquées, ce problème est très courant, il fonctionne lorsque
est utilisé au lieu de
cette alternative.
la source
Cela a fonctionné pour moi ...
Utilisation
la source
Vous pouvez également le faire
Cela a fonctionné pour moi !!
la source
Comme il est dit, vous avez besoin d'une activité comme contexte pour la boîte de dialogue, utilisez "YourActivity.this" pour un contexte statique ou vérifiez ici comment utiliser un dynamique en mode sans échec
la source
Essayez de réinitialiser
dialog
le type de fenêtre surN'oubliez pas d'utiliser l'autorisation
android.permission.SYSTEM_ALERT_WINDOW
la source
Texte ici: -
utilisez ceci pour obtenir le
activity
contexte pourprogressdialog
ou
progressdialog = new ProgressDialog(this);
utilisez-le pour obtenir le contexte d'application pour
BroadcastListener
pas pourprogressdialog
.la source
Le meilleur moyen et le plus sûr d'afficher un «ProgressDialog» dans une AsyncTask, pour éviter les problèmes de fuite de mémoire est d'utiliser un «Handler» avec Looper.main ().
puis dans le «onCreate»
Vous avez maintenant terminé avec la partie configuration. Appelez maintenant 'showProgress ()' et 'hideProgress ()' dans AsyncTask.
la source