305 votes

Android 1.6 : "Android.view.WindowManager$BadTokenException : Impossible d'ajouter une fenêtre -- token null ne correspond pas à une application".

J'essaie d'ouvrir une fenêtre de dialogue, mais à chaque fois que j'essaie de l'ouvrir, une exception se produit :

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'identifiant de l'écran. Le site onCreateDialog se connecte bien 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 ? Certaines questions ont fait état de ce problème lors de la création d'un dialogue à partir de onCreate ce qui se produit parce que l'activité n'est pas encore créée, mais cela provient d'un appel à partir d'un objet de menu, et la fonction appContext semble être correctement renseignée dans le débogueur.

610voto

Torp Points 5216

Au lieu de : Context appContext = this.getApplicationContext(); vous devez utiliser un pointeur vers l'activité dans laquelle vous vous trouvez (probablement this ).

J'ai été piqué par ça aujourd'hui aussi, le plus ennuyeux c'est que le getApplicationContext() est verbatim de developer.Android.com :(

2 votes

Il est également signalé comme un bogue (bien qu'il ne l'était pas lorsque l'utilisateur a posté la question) : code.google.fr/p/Android/issues/detail?id=11199

63 votes

Si cela peut aider quelqu'un, utilisez myActivity.this comme contexte dans une boîte de dialogue.

13 votes

Cette question et réponse aura 3 ans dans 2 jours. J'obtiens toujours une réputation, donc je suppose que Google n'a toujours pas corrigé ses documents...

78voto

Samuh Points 16564

Vous ne pouvez pas afficher une fenêtre/un dialogue d'application par le biais d'un contexte qui n'est pas une activité. Essayez de passer une référence d'activité valide

0 votes

Comment ? J'ai essayé activity.this y activity.getBaseContext() mais sans succès. Vous pouvez nous aider ?

3 votes

Je l'ai. Passez directement le nom de votre activité dedans. Sans .this .

45voto

kenyee Points 818

Idem pour le truc du getApplicationContext.

Les documents sur le site Android disent de l'utiliser, mais ça ne marche pas...grrrrr :-P

Fais-le :

dialog = new Dialog(this); 

"ceci" est généralement votre activité à partir de laquelle vous commencez le dialogue.

43voto

Pradeep Points 956

Les documents Android suggèrent d'utiliser getApplicationContext() ;

mais cela ne fonctionnera pas ; au lieu de cela, utilisez votre activité actuelle en instanciant AlertDialog.Builder ou AlertDialog ou Dialog...

Ex :

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

o

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

0 votes

Cela m'a beaucoup aidé. J'essayais de créer une boîte de dialogue à partir d'une autre boîte de dialogue et le simple fait d'avoir "AlertDialog.Builder(this) ;" donnait lieu à une erreur. Merci !

0 votes

(ActivityName.this) est particulièrement utile lorsqu'on essaie de créer une boîte de dialogue dans l'onClick d'un bouton.

0 votes

Mon problème est que je construis un ProgressDialog à l'intérieur d'un AlertDialog à l'intérieur d'un adaptateur... Je n'arrive pas à le faire fonctionner.

13voto

T.Hawk Points 111

J'ai eu un problème similaire où j'avais une autre classe comme celle-ci :

public class Something {
  MyActivity myActivity;

  public Something(MyActivity myActivity) {
    this.myActivity=myActivity;
  }

  public void someMethod() {
   .
   .
   AlertDialog.Builder builder = new AlertDialog.Builder(myActivity);
   .
   AlertDialog alert = builder.create();
   alert.show();
  }
}

La plupart du temps, il fonctionnait bien, mais parfois il se plantait avec la même erreur. Je me suis alors rendu compte que dans MyActivity J'avais...

public class MyActivity extends Activity {
  public static Something something;

  public void someMethod() {
    if (something==null) {
      something=new Something(this);
    }
  }
}

Parce que je tenais l'objet comme static une deuxième exécution du code contenait toujours la version originale de l'objet, et faisait donc toujours référence à l'objet original. Activity qui n'existe plus.

Une erreur stupide, d'autant plus que je n'avais pas besoin de tenir l'objet en tant que static en premier lieu...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X