android de Vue qui n'est pas attachée à la fenêtre du gestionnaire de
Je suis parmi les exceptions suivantes:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
J'ai googlé et de voir qu'il a quelque chose à voir avec les popups et la rotation de l'écran, mais il n'y a aucune référence à mon code.
Les questions sont:
- est-il un moyen de savoir
exactement quand cette question est
qui se passe? - autre que de tourner l'écran, est-il un autre événement ou une action qui déclenche cette erreur?
- comment puis-je empêcher que cela se produise?
- Voyez si vous pouvez expliquer comment l'activité est décrite dans le manifeste et que l'activité est à l'écran lorsque l'erreur se produit. Voyez si vous pouvez gruger votre problème en un minimum de cas de test.
- Peut-être que vous essayez de modifier votre point de vue avant de
View#onAttachedToWindow()
a été appelé?
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème, où sur un écran de changement d'orientation, l'activité terminée avant que le AsyncTask avec la boîte de dialogue de progression achevée. Il me semblait résoudre ce problème en définissant la boîte de dialogue null
onPause()
et puis vérification de cette dans le AsyncTask avant de le rejeter.... dans mon AsyncTask:
Après un combat avec ce problème, j'ai finalement aboutir à cette solution de contournement:
Parfois, la bonne gestion des exceptions fonctionne bien si il n'y avait pas une meilleure solution pour ce problème.
Si vous avez un
Activity
objet traîner, vous pouvez utiliser leisDestroyed()
méthode:C'est bien si vous avez un non-anonyme
AsyncTask
sous-classe que vous pouvez utiliser dans différents endroits.Je suis en utilisant une mesure statique de la classe qui rend la - montre et cache une boîte de dialogue.
cette classe est utilisée par d'autres activités, non seulement un activiy.
Maintenant, le problème que vous avez décrit est également apparu à moi et j'ai passé la nuit pour trouver une solution..
Enfin je vous présente la solution!
si vous souhaitez afficher ou faire disparaître une boîte de dialogue et vous ne savez pas quelle activité a initié le dialogue afin de toucher ensuite le code suivant est pour vous..
J'ai ajouté ce qui suit à l'manifeste pour que l'activité
Solution ci-dessus ne fonctionne pas pour moi. Donc, ce que j'ai fait est de prendre
ProgressDialog
qu'à l'échelle mondiale, puis l'ajouter à mon activitéde sorte que, si l'activité est détruit, la ProgressDialog sera également détruire.
Pour la question 1):
Considérant que le message d'erreur ne semble pas dire de quelle ligne de votre code est à l'origine du problème, vous pouvez le retrouver en utilisant les points d'arrêt. Les points d'arrêt suspendre l'exécution du programme lorsque le programme arrive à des lignes de code spécifiques. En ajoutant des points d'arrêt aux endroits critiques, vous pouvez déterminer la ligne de code qui provoque la panne. Par exemple, si votre programme est de s'écraser à un setContentView() en ligne, vous pourriez mettre un point d'arrêt là. Lorsque le programme s'exécute, il fera une pause avant d'exécuter cette ligne. Si de reprendre les causes de la panne du programme avant d'atteindre le prochain point d'arrêt, vous savez alors que la ligne qui a tué le programme a été entre les deux points.
L'ajout de points de contrôle est facile si vous êtes en utilisant Eclipse. Faites un clic droit dans la marge à gauche de votre code et sélectionnez "Basculer le point d'arrêt". Vous devez ensuite exécuter votre application en mode debug, le bouton qui ressemble à un insecte vert à côté de la normale bouton exécuter. Lorsque le programme rencontre un point d'arrêt, Eclipse va basculer vers le débogage point de vue et de vous montrer la ligne, c'est en attente. Pour démarrer l'exécution du programme, encore une fois, regardez pour la "Reprise" du bouton, qui ressemble à un "Jeu", mais avec une barre verticale à gauche du triangle.
Vous pouvez également remplir votre demande avec le Journal.d("Ma demande", "Quelques informations ici qui vous indique où la ligne du journal est"), qui publie des messages dans l'Éclipse du LogCat fenêtre. Si vous ne pouvez pas trouver cette fenêtre, l'ouvrir avec Fenêtre -> Show View -> Autres... -> Android -> LogCat.
Espère que ça aide!
selon le code de la windowManager (lien ici), cela se produit lorsque la vue que vous essayez de mettre à jour (qui appartient probablement à une boîte de dialogue, mais pas nécessaire) n'est plus attaché à la vraie racine de windows.
comme d'autres l'ont suggéré, vous devez vérifier l'état de l'activité avant d'effectuer des opérations spéciales sur vos boîtes de dialogue.
voici la relavant du code, qui est la cause du problème (copié à partir du code source Android) :
Mon problème a été résolu par uhlocking la rotation de l'écran sur mon android de l'application qui a été la cause m'a un problème fonctionne maintenant parfaitement
Une autre option est de ne pas commencer la tâche asynchrone jusqu'à ce que le dialogue est attaché à la fenêtre en substituant onAttachedToWindow() dans la boîte de dialogue, de cette façon, il est toujours révocable.
Ou tout Simplement vous Pouvez ajouter
qui fera le
ProgressDialog
à pas capables d'annulationPourquoi ne pas essayer de l'attraper, comme ceci:
lorsque vous déclarez une activité dans le manifeste, vous devez android:configChanges="orientation"
exemple: