Comment puis-je obtenir de l'emplacement actuel d'un ActionBar MenuItem?
J'ai envie de montrer un peu d'info de l'étiquette en dessous d'un MenuItem
dans l'app ActionBar
.
Pour positionner correctement j'ai besoin de connaître la position x d'un MenuItem
.
Google m'a amené aucun résultat utile jusqu'à présent.
Est-il même possible?
Vous devez vous connecter pour publier un commentaire.
J'ai enfin trouvé une réponse à cette! Il est très orthodoxe, mais pas trop. Les seuls inconvénients sont les suivants:
MenuItem
s avec votre propreView
. UnImageView
est assez similaire à celle de la norme, mais il manque des fonctionnalités telles que longue-en appuyant sur pour afficher une info-bulle, et probablement d'autres choses.Ok, voici comment nous le faisons. Changer votre
Activity
'sonCreateOptionsMenu()
à quelque chose comme ceci:Et puis vous avez une fonction qui met à jour vos utiles instructions de vue avec l'emplacement de la touche et redessine c':
Enfin rendre votre fantaisie schmancy vue personnalisée qui tire une flèche (à proximité), le bouton. Dans votre
onDraw
méthode, vous pouvez convertir des coordonnées de l'écran de retour àCanvas
coordonnées à l'aide du mêmegetLocationOnScreen
fonction. Quelque chose comme ceci:(Mais, évidemment, vous avez à clip à l'emplacement cible de la taille du Canevas). Si vous allez pour la même méthode que Google, où vous superposez une vue sur la totalité de l'écran, vous n'aurez pas à vous soucier de cela, mais il est plus intrusive. Google méthode certainement ne pas utiliser n'importe quel Api privées (étonnamment). Découvrez
Cling.java
dans le Launcher2 code.D'ailleurs, si vous regardez le code source de Google similaire de mise en œuvre de ce pour que le lanceur (qu'ils appellent les instructions de l'écran, une
Cling
pour une raison quelconque), vous pouvez voir que c'est encore plus hacky. En gros, ils utilisent absolue de l'écran positions déterminées par la mise en page est utilisé.Espère que cela aide les gens à!
J'ai trouvé un autre moyen de faire un crochet sur un bouton de la barre d'action, qui peuvent être un peu plus simple que la solution retenue.
Vous pouvez simplement appeler
findViewById
, avec l'id de l'élément de menu!Maintenant, le plus dur est quand pouvez-vous appeler cela? Dans
onCreate
etonResume
, il est trop tôt. Bien une façon de le faire est d'utiliser laViewTreeObserver
de la fenêtre:Cela va dans
onCreate
.Note: ceci a été testé sur un projet à l'aide de ActionBarSherlock, il est possible qu'il ne fonctionne pas avec un "vrai" de la barre d'action.
if(viewTreeObserver.isAlive())
vérifier avant de retirer l'auditeur, car parfois, une exception est levée si ce n'est pas vivant.Juste la poignée de l'Élément de Menu comme un mode normal..comme ceci:
Remarque: j'ai testé avec mon activité configuré à l'aide de la Barre d'outils, non pas directement comme ActionBar...mais je suppose que cela devrait fonctionner de la même façon.
Cette réponse est aujourd'hui démodé, Regardez pour la accepté de répondre au-dessus de
J'ai trouvé que (en ce moment) il n'y a aucun moyen de déterminer les axes x/y de la valeur d'un élément de menu. Voir les éléments de menu pourrait tout aussi bien être cachés à partir de l'écran jusqu'à ce que l'utilisateur appuie sur le bouton menu. Dans Android 3.0 et vous avez la possibilité de mettre en œuvre le menu de l'application
ActionBar
. Vous pouvez ajouter un grand nombre d'éléments de menu dans l'actionbar, quand il n'y a plus de place pour positionner un élément sur la barre, il suffit de créer un "Dépassement" bouton qui va contenir tous les éléments de menu qui ne peuvent pas être placés sur la barre d'action en raison d'un manque de place ou parce que le programmeur de définir explicitement l'élément de menu apparaisse dans le menu contextuel.Tout ce comportement est probablement la raison pour laquelle les éléments de menu n'ont pas de position x/y, vous pouvez récupérer (ou l'ensemble).
Comment j'ai finalement résolu ce problème en utilisant le
Paint.measureText()
fonction pour déterminer la largeur de chaque élément de menu serait dans la barre d'action devrait être et l'utiliser pour calculer le décalage entre le côté droit de l'écran où l'étiquette doit être.C'est une solution, mais si jamais quelqu'un a le même problème que moi, sachez que cela fonctionne bien. Rappelez-vous juste pour définissez la taille de police sur la
Paint
objet ou d'autre lorsque vous mesurez le texte de la longueur, il sera très probablement calculer la largeur du texte en utilisant une police de caractères différente de la taille de votre élément de menu de la taille de police.