Android 'Impossible d'ajouter la fenêtre - le jeton null n'est pas pour une exception d'application


134

J'obtiens l'exception Android suivante lorsque j'essaye d'ouvrir une boîte de dialogue. Quelqu'un peut-il m'aider à comprendre ce qui se passe et comment puis-je résoudre ce problème?

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
Comment sommes-nous censés savoir sans publier de code?
Falmarri


1
Veuillez vous référer à cette réponse, la chose principale pour publier le lien de cette réponse est qu'il y a une belle conversation dans les commentaires sur cette réponse qui décrit pourquoi ce problème arrive et quelle est la meilleure façon de le résoudre http://stackoverflow.com/a/ 7229248/501483
dharam

Si vous utilisez Service, lisez stackoverflow.com/questions/23516689/… .
CoolMind

Réponses:


421

J'imagine - essayez-vous de créer Dialog avec un contexte d'application? Quelque chose comme ça:

new Dialog(getApplicationContext());

C'est faux. Vous devez utiliser un contexte d'activité.

Vous devez essayer comme:

new Dialog(YourActivity.this);

1
Merci. Mais je n'ai pas utilisé la nouvelle boîte de dialogue (getApplicationContext ()); J'utilise uniquement 'new AlertDialog.Builder (mContext);' où mContext est un référent à une activité.
michael

10
Ensuite, mContext doit être MyActivity.this.
Luis

10
La documentation Android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) pour créer une boîte de dialogue personnalisée contient cette erreur. Contexte mContext = getApplicationContext (); Dialogue dialog = new Dialog (mContext); Votre correctif mène à Dialog dialog = new Dialog (this); Ce qui fonctionne! Merci
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html a été corrigé (depuis un certain temps). Je le souligne simplement pour référence. Le modèle a également été amélioré. :)
Martin Marconcini

2
Utilisez getActivity()@SagarDevanga
Pratik Butani

34

Vous pouvez continuer à utiliser getApplicationContext(), mais avant utilisation, vous devez ajouter cet indicateur:, dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)et l'erreur ne s'affichera pas.

Et n'oubliez pas d'ajouter la permission:

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

Oui, c'est assez simple. Et n'oubliez pas d'ajouter la permission, j'ai édité tout à l'heure.
codezjx

3
Impossible d'utiliser getActivity () dans un RecyclerAdapter
Martin Erlic

C'est génial :)
Syed Hamza Hassan

Comment ajoutez-vous le drapeau?
Conner Dassen

13

Dans mon cas, j'essayais de créer mon dialogue comme ceci:

new Dialog(getApplicationContext());

J'ai donc dû changer pour:

new Dialog(this);

Et ça marche bien pour moi;)


1
Votre réponse est correcte, mais elle ne fonctionnera que lorsque vous serez dans le périmètre d'activité. Si vous êtes dans une portée interne, vous devez utiliser MyActivity.classau lieu de thiscar thisfait référence à un objet différent.
Shahar

1
En outre, thisnous assurerons que votre Dialoginherits votre thème.
TheRealChx101

12

Essayez getParent()à l'argument contextcomme new AlertDialog.Builder(getParent());j'espère que cela fonctionnera, cela a fonctionné pour moi.


Pourquoi utiliser getParent ()?, Que signifie?
José Castro

2
Lorsque vous affichez une boîte de dialogue dans une autre classe qui n'étend pas la classe d'activité, vous risquez de ne pas obtenir le contexte de cette classe qui étend l'activité. Donc, pour obtenir le contexte à l'intérieur de votre classe où vous essayez d'afficher la boîte de dialogue mais sans étendre l'activité, vous pouvez utiliser le getParent () qui vous renvoie le contexte de cette activité supérieure.
Priyank Joshi

1
Merci @PriyankJoshi, vous m'avez sauvé la journée, cela résout également l'exception étrange de "Android Impossible d'ajouter la fenêtre n'est pas valide; votre activité est-elle en cours?".
Eslam Yousef Mohammed

Comment utiliser getParent ()?
vinidog

Je vous remercie! Cela a fonctionné dans mon cas. J'appelais this.parent.getActivity().getApplicationContext()mais j'ai this.parent.getActivity()fait l'affaire.
carlodonz

3

Je suppose - essayez-vous de créer Dialog en utilisant.

 getApplicationContext()
 mContext which is passed by activity.

si vous affichez une classe de non-activité de dialogue, vous devez passer l'activité en paramètre.

Activity activity=YourActivity.this;

Maintenant, cela fonctionnera très bien.

Si vous rencontrez des problèmes, faites-le moi savoir.


2

J'ai essayé avec ceci dans le champ contextuel:

this.getActivity().getParent()

et cela fonctionne bien pour moi. Cela provenait d'une classe qui s'étend de "Fragment":

public class filtro extends Fragment{...

2

Bonjour, si vous utilisez un adaptateur, il y a peut-être une chance.
Tout ce que vous devez savoir lorsque vous avez utilisé une boîte de dialogue dans l'adaptateur, getContext (), le contexte ou l'activité ne fonctionnera pas parfois.

Voici l'astuce que j'ai utilisée v.getRootView().getContext() où v est l'objet de vue auquel vous faites référence.
Par exemple.


            @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

Je vous remercie ! pour avoir sauvé mon temps précieux !! (^_^)
Nice umang

1

J'ai eu la même exception. ce que je fais pour résoudre ce problème est de passer une instance du dialogue en tant que paramètre dans la fonction et de l'utiliser au lieu de ne transmettre que le contexte, puis d'utiliser getContext (). cette solution résout mon problème, j'espère qu'elle pourra vous aider


0

J'ai eu cette exception, lorsque j'ai essayé d'ouvrir la boîte de dialogue de progression sous Cordova Plugin en utilisant ci-dessous deux cas,

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

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

Plus tard changé comme ça,

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

Cela fonctionne bien pour moi.


0

Utilisez ceci et le contexte n'a pas fonctionné pour moi ... mais MyActivityName.this a fonctionné. J'espère que cela aidera tous ceux qui en ont besoin.


0

J'ai résolu cette erreur en ajoutant ci-dessous l'autorisation utilisateur dans AndroidManifest.xml

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

Aussi, boîte de dialogue Initialiser l'alerte avec le nom de l'activité:

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

Pour plus de détails, visitez ==> Comment créer une boîte de dialogue d'alerte dans Android

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.