Je développe une application pour Android et j'utilise une fenêtre contextuelle lorsque l'utilisateur clique sur un objet de barre de menu spécifique (composé de petites images alignées horizontalement) en bas de l'écran.
Sur le clic, je veux que la fenêtre contextuelle soit ancrée dans le coin supérieur gauche de la vue sur laquelle vous avez cliqué et s'affiche en haut.
Les seules méthodes qui semblent pertinentes sont showAsDropDown (View anchor, int xoff, int yoff) et showAtLocation (View parent, int gravity, int x, int y)). Le problème avec showAsDropDown est qu'il est ancré dans le coin inférieur gauche de la vue.
Existe-t-il une autre façon de mettre cela en œuvre?
popupWindow.showAtLocation(...)
montre en fait la fenêtre absolument positionnée sur écran (pas même l'application). L'ancre de cet appel n'est utilisée que pour son jeton de fenêtre. Les coordonnées sont des décalages par rapport à la gravité donnée.
Ce que vous voulez réellement utiliser, c'est:
popupWindow.showAsDropDown(anchor, offsetX, offsetY, gravity);
Cet appel n'est disponible que dans l'API 19+, donc dans les versions antérieures, vous devez utiliser:
popupWindow.showAsDropdown(anchor, offsetX, offsetY);
Ces appels affichent la fenêtre contextuelle relative à la vue d'ancrage spécifiée. Notez que la gravité par défaut (lors d'un appel sans gravité spécifiée) est Gravity.TOP|Gravity.START
donc si vous utilisez explicitement Gravity.LEFT
à divers endroits de votre application, vous passerez un mauvais moment :)
popupWindow.showAtLocation(anchor, Gravity.BOTTOM, 0, anchor.getHeight());
Celui que vous souhaitez utiliser est showAtLocation(...)
. Vous spécifiez la vue d'ancrage (celle sur laquelle l'utilisateur clique) et la positionnez par rapport à celle-ci via le paramètre gravity
et les décalages. Pensez au paramètre gravity
comme le PopupWindow
est presque comme une vue enfant et la vue parent est comme une disposition de conteneur.
Vous devriez pouvoir mettre Gravity.LEFT | Gravity.TOP
comme paramètre.
Vous aviez juste besoin de déplacer la popupWindow de la hauteur de son ancre en utilisant le paramètre yoff dans la syntaxe showAsDropDown (View anchor, int xoff, int yoff).
popupWindow.showAsDropDown(anchor, 0, -anchor.getHeight()+popupView.getHeight);
Sachez également que si la hauteur maximale autorisée pour l'ancrage ne permet pas la transformation, la fenêtre contextuelle risque de ne pas s'afficher correctement.
J'ai ce code: PopupWindow sous une vue spécifique (Gravity End) pour toutes les versions sdk.
// display the popup[![enter image description here][1]][1]
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
mPopupWindow.showAsDropDown(v, 0, 0, Gravity.END);
} else {
mPopupWindow.showAsDropDown(v, v.getWidth() - mPopupWindow.getWidth(), 0);
}
Ici, View v est ImageButton Calendar.
vous pouvez afficher le popup toujours au-dessus de l'ancre en suivant
popupWindow.showAsDropDown(anchor, 0, -anchor.getHeight()-popupView.getHeight);
popupwindow.showAsDropDown (ancre, 0, -125); cette chose fonctionne pour moi