Pourquoi ne AlertDialog.Générateur(Context context) accepte uniquement l'Activité en tant que paramètre?
Dans mon processus d'apprentissage continu (boîtes de dialogue, cette fois), j'ai découvert que cela fonctionne:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Tandis que le suivant ne fonctionne pas (échec à l'exécution avec WindowManager$BadTokenException):
AlertDialog.Builder builder = new AlertDialog.Builder(this.getApplicationContext());
Je ne comprends pas pourquoi, parce que le constructeur pour AlertDialog.Le constructeur est défini de manière à accepter Contexte comme un paramètre, pas de l'Activité:
public AlertDialog.Générateur (Contexte
contexte)Constructeur à l'aide d'un cadre pour ce
constructeur et l'AlertDialog il
crée.
Ce qui me manque?
- C'est également vrai pour d'autres boîtes de dialogue. Bonne question, +1
- J'ai découvert un autre thread traitant avec un problème similaire, mais aucune explication n': stackoverflow.com/questions/3968170/...
- Ma conjecture est que le Constructeur n'est pas simplement demander pour une Activité, car elle permettrait d'empêcher à l'avenir de l'API d'avoir d'autres types de contextes qui peuvent afficher une boîte de dialogue.
- bonne idée, à l'exception de son pas juste à l'avenir, son maintenant. AlertDialog.Générateur peut être utilisé par ListActivity, Service, ... et tout l'héritage de Contexte exactement parce que son argument est pour un résumé de Contexte.
- en fait, vous ne pouvez pas afficher les boîtes de dialogue directement à partir des classes héritant de
Context
autres queActivity
. mail-archive.com/[email protected]/... - ahh je me rends compte que je ne l'ai fait avec de l'Activité et de ses sous-classes, et il n'est pas judicieux de l'utiliser à partir d'un Service fait. En tout cas, j'ai fait le travail de la mine en passant l'activité dans les mêmes classes que d'un arg.
- Curieusement, Google fournit un exemple qui indique que vous pouvez utiliser getcontexteapplication(). Au bas de cette page (developer.android.com/guide/topics/ui/dialogs.html) ils fournissent une AlertDialog exemple qui inclut ceci: Contexte mContext = getcontexteapplication(); ... builder = new AlertDialog.Générateur(mContext); Techniquement, il NE me permettre de faire cela, mais mon application explose lorsque j'essaye d'afficher la boîte de dialogue. Hmmm...
Vous devez vous connecter pour publier un commentaire.
Une Activité hérite d'un Contexte. AlertDialog.Constructeur spécifie un Contexte argument, car il peut alors être utilisé par TOUTE la classe qui est une sous-classe de Contexte, y compris une Activité, ListActivity, Service, ... (Il y a une codification commune idiome derrière ce - que vous pouvez en apprendre davantage à ce sujet par la lecture de l'Élément de I8 (sur les Interfaces et les classes Abstraites) de Joshua Bloch est fantastique Efficace Java).
getcontexteapplication() retourne le contexte de votre application, qui est essentiellement le même que vos activités du contexte et de la "la plupart" est ce qui est à vous jeter hors. Les détails ne sont pas clairs, mais c'est largement un problème rencontré, et la réponse typique est d'utiliser le contexte pour l'écriture de l'alerte à l'écran. Note que c'est pas celui retourné par getcontexteapplication().
Maintenant, si vous êtes comme moi, vous pouvez dire "mais je suis en train de travailler dans une classe qui n'hérite pas de l'Activité - qui est pourquoi je veux utiliser getcontexteapplication() pour cela, en premier lieu - duh!" Je suis tout à fait de ne pas parler comme brutalement comme ça ;p .. le point est que je suis ici, trop. Je l'ai fixée comme suit: 1) demandez-vous "puis-je avoir mon UI AlertDialog code dans un non-activité de la classe parce que je veux le partager à travers des activités. ou même à travers ListActivities, Services, ...?". Si pas, hmmm... avez-vous vraiment l'AlertDialog de l'INTERFACE utilisateur des appels dans le code que vous ne pouvez pas garantir aurez accès à l'INTERFACE utilisateur (et donc du contexte)? Si oui, revoir votre conception.
En supposant que vous ne voulez partager cette classe à travers des Activités, ... la réponse devient claire. Vous souhaitez que votre classe pour être utilisable par une variété de visiteurs, chaque probablement avec son propre contexte: si l'appelant doit passer son contexte, dans votre classe comme argument:
myClass(Context theContext, ...) { ... }
Chaque activité, le service, etc. puis fait des appels de la sorte:
myClass(this, ...);
Semble familière?
De ne faire attention! que si vous êtes en partage de code, vous devez tenir compte de la possibilité pour les différents appels à venir dans votre code partagé en parallèle, avec toutes les ramifications multiples. C'est au-delà de notre portée ici...
Amusez-vous 🙂
AlertDialog est une sous-classe de Dialogue, qui est associé à un Fenêtre, qui est associé à un LayoutParams. L'un de ces paramètres est la fenêtre type. Le type par défaut est TYPE_APPLICATION_ATTACHED_DIALOG, ce qui nécessite une fenêtre parent.
La WindowManager liés à une Activité est configuré pour utiliser la fenêtre de la fenêtre parent. Le WindowManager associé à une Application n'est associée aucune fenêtre parent.
Bas de ligne: Pour afficher une boîte de dialogue, vous devez soit modifier la valeur par défaut de la fenêtre de type pour un type qui n'a pas besoin d'un parent de la fenêtre, ou vous devez utiliser un contexte qui est associé à un parent de la fenêtre.