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)
Michael
la source
8
Comment sommes-nous censés savoir sans publier de code?
Falmarri
1
Double
blahdiblah
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);
Peter Knego
la source
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" />
codezjx
la source
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;)

postNuKe
la source
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.

Priyank Joshi
la source
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.

Harshid
la source
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{...
Matias
la source
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
kontashi35
la source
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

Anonyme-E
la source
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.

soorya
la source
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.

Makvin
la source
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

Ganesh Garad
la source