Je n'arrive pas à comprendre pourquoi cela se produit. Ce code:
mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);
fonctionne très bien. Cependant, ce code:
mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);
lève l'exception suivante:
W/WindowManager( 569): Attempted to add window with non-application token WindowToken{438bee58 token=null}. Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049): at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049): at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049): ... 11 more
Des idées pourquoi cela se produit? J'appelle cela de la onCreate
méthode.
android
progressdialog
Félix
la source
la source
Fragment
, stackoverflow.com/questions/24825114/…Réponses:
Quelle version d'API utilisez-vous? Si j'ai raison sur le problème, cela a été corrigé dans Android 1.6 (API version 4).
Cela ressemble à la référence d'objet qui
getApplicationContext()
retourne juste des points à null. Je pense que vous rencontrez un problème similaire à celui que j'ai eu en ce sens qu'une partie du code duonCreate()
est en cours d'exécution avant que la fenêtre ne soit réellement construite. Cela va être un hack, mais essayez de lancer un nouveau Thread dans quelques centaines de millisecondes (IIRC: 300-400 semble fonctionner pour moi, mais vous devrez bricoler) qui ouvre votre ProgressDialog et démarre tout ce dont vous avez besoin ( ex. réseau IO). Quelque chose comme ça:la source
J'utilise la version 2.1 d'Android avec le niveau d'API 7. J'ai rencontré ce problème (ou similaire) et résolu en utilisant ceci:
au lieu de cela:
J'espère que cela t'aides :)
la source
Pour moi, j'ai travaillé en changeant
à
Ce qui est étrange, c'est que le premier se trouve dans le didacticiel Google et que les gens obtiennent une erreur à ce sujet.
la source
this
tout seul ne fonctionnera pas si vous faites cela dans un écouteur de clic, par exemple.Je ne pense pas que ce soit un problème de synchronisation autour d'un contexte d'application nul
Essayez d'étendre l'application dans votre application (ou utilisez-la simplement si vous l'avez déjà)
Rendez l'instance disponible en tant que singleton privé. Ce n'est jamais nul
Créer un assistant statique dans MyApp (qui utilisera le singleton)
BOOM!!
Consultez également la réponse de l'ingénieur Android ici: WindowManager $ BadTokenException
Maintenant, je suis d'accord, cela n'a pas de sens que la méthode prenne un paramètre Contexte, au lieu d'Activité.
la source
Après avoir lu les réponses ci-dessus, j'ai trouvé que pour ma situation, ce qui suit a résolu le problème.
Cela a jeté l'erreur
Sur la base des réponses précédentes suggérant que le contexte n'était pas le bon, j'ai modifié getApplicationContext () pour récupérer le contexte de la vue transmise aux boutons de la méthode onClick.
Je ne comprends pas complètement le fonctionnement de Java, donc je peux me tromper, mais je suppose que pour ma situation spécifique, la cause aurait pu être liée au fait que l'extrait ci-dessus a été défini dans une classe d'activité abstraite; hérité et utilisé par de nombreuses activités, cela a peut-être contribué au fait que getApplicationContext () ne retourne pas un contexte valide ?? (Juste une supposition).
la source
Je crée une vue cartographique avec des superpositions détaillées. Je créais ma superposition élémentaire comme ceci à partir de ma mapActivity:
J'ai trouvé que j'obtiendrais l'exception "android.view.WindowManager $ BadTokenException: Impossible d'ajouter la fenêtre - le jeton null n'est pas pour une application" lorsque la méthode onTap de mon itemizedoverlay a été déclenchée (lorsque l'emplacement est tapé sur la mapview).
J'ai trouvé que si je passais simplement «this» au lieu de «getApplicationContext ()» à mon constructeur, le problème disparaissait. Cela semble étayer la conclusion d'alienjazzcat. bizarre.
la source
Pour les activités affichées dans TabActivities, utilisez getParent ()
au lieu de
la source
Pour Android 2.2,
utilisez ce code:
au lieu de ce code:
Remarque: ma boîte de dialogue personnalisée est créée en dehors de la
activity.onCreateDialog(int dialogId)
méthode.la source
Essayez -
la source
J'ai eu un problème similaire avec les fragments (de compatibilité) dans lesquels l'utilisation d'un
getActivity()
inside leProgressDialog.show()
bloque. Je conviens que c'est à cause du timing.Une solution possible:
à la place d'utiliser
Placez le mContext le plus tôt possible pour lui donner plus de temps pour saisir le contexte. Il n'y a toujours aucune garantie que cela fonctionnera, cela réduit simplement la probabilité d'un crash. Si cela ne fonctionne toujours pas, vous devrez recourir au piratage de la minuterie (ce qui peut causer d'autres problèmes de synchronisation comme fermer la boîte de dialogue plus tard).
Bien sûr, si vous pouvez utiliser
this
ouActivityName.this
, c'est plus stable carthis
pointe déjà vers quelque chose. Mais dans certains cas, comme avec certaines architectures Fragment, ce n'est pas une option.la source
(Pour de futures références)
Je pense que c'est parce qu'il y a des différences dans le contexte d'application et le contexte d'activité, comme expliqué ici: http://www.doubleencore.com/2013/06/context/
Ce qui signifie que nous ne pouvons pas afficher de dialogue en utilisant le contexte d'application. C'est tout.
la source
Pour utiliser les boîtes de dialogue dans les activités, procédez comme suit:
Pour utiliser des boîtes de dialogue à l'intérieur de fragments, procédez comme suit:
C'est ça ^ _ ^
la source
Ce que j'ai fait pour contourner ce problème a été de créer une classe de base pour toutes mes activités où je stocke des données globales. Dans la première activité, j'ai enregistré le contexte dans une variable de ma classe de base comme ceci:
Classe de base
Première activité dérivée de la classe de base
Ensuite, j'utilise mycontext au lieu de getApplicationContext lors de la création de boîtes de dialogue.
la source
Si vous appelez ProgressDialog.show () dans un fragment, le cast du mContext en Activity a fonctionné pour moi.
la source
C'est un problème commun. Utilisez
this
plutôt quegetApplicationContext()
Cela devrait résoudre votre problèmela source
J'ai implémenté la boîte de dialogue d'alerte pour les exceptions lancées sur la vue active actuelle.
Compte tenu de la même fenêtre Exception.I écrire du code pour recevoir une alerte de onCreate (). Si simple , j'utilisé
context = this;
aprèssetContentView()
déclarationonCreate()
variable de contexte method.Taken que mondial commeContext context;
L'échantillon de code est
L'échantillon de méthode d'alerte est
Cela fonctionne très bien pour moi.En fait, j'ai recherché cette erreur sur StackOverflow, j'ai trouvé cette requête.Après avoir lu toutes les réponses de cet article, j'ai essayé de cette façon cela fonctionne.Je pensais que c'était une solution simple pour surmonter l'exception.
Merci, Rajendar
la source
si vous rencontrez un problème sur groupActivity, ne l'utilisez pas. PARENT est un statique du Parent ActivityGroup.
au lieu de
la source
Une boîte de dialogue est toujours créée et affichée dans le cadre d'une activité. Vous devez passer dans un contexte d'activité au lieu du contexte d'application.
http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog
la source