Je dois afficher PopupWindow
sous un Views
affiché à l'écran.
Comment puis-je calculer les coordonnées de View
nécessaires et placer PopupWindow
en dessous? Les exemples de code sont les bienvenus. Merci.
La localisation d'une vue déjà affichée est assez facile - voici ce que j'utilise dans mon code:
public static Rect locateView(View v)
{
int[] loc_int = new int[2];
if (v == null) return null;
try
{
v.getLocationOnScreen(loc_int);
} catch (NullPointerException npe)
{
//Happens when the view doesn't exist on screen anymore.
return null;
}
Rect location = new Rect();
location.left = loc_int[0];
location.top = loc_int[1];
location.right = location.left + v.getWidth();
location.bottom = location.top + v.getHeight();
return location;
}
Vous pouvez ensuite utiliser un code similaire à ce qu'Ernesta a suggéré de coller la fenêtre contextuelle à l'emplacement approprié:
popup.showAtLocation(parent, Gravity.TOP|Gravity.LEFT, location.left, location.bottom);
Cela afficherait le popup directement sous la vue d'origine - rien ne garantit cependant qu'il y aurait assez de place pour afficher la vue.
vous avez getLeft()
et getBottom()
pour obtenir la position exacte de la vue dans la mise en page. Vous avez également getWidth()
et getHeight()
pour connaître l'espace exact occupé par la vue. Si vous souhaitez positionner votre fenêtre contextuelle sous une vue.
Vous setLeft()
et setTop()
méthodes de la vue pour positionner la nouvelle fenêtre popup.
Pour obtenir la taille de l'écran principal de l'application sans des éléments comme le titre et les barres de notification, remplacez la méthode suivante dans la classe générant l'écran en question (les tailles sont mesurées en pixels):
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
}
Pour obtenir les coordonnées inférieures de la vue sous laquelle vous souhaitez afficher la fenêtre contextuelle:
View upperView = ...
int coordinate = upperView.getBottom();
Tant que height - coordinate
Est suffisamment grand pour votre affichage popup, vous pouvez simplement placer le popup comme ceci:
PopupWindow popup = new PopupWindow();
Button button = new Button(this);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
popup.showAtLocation(parent, Gravity.CENTER, 0, coordinate);
}
});
Ici, showAtLocation()
prend la vue parent comme argument avec les décalages de gravité et d'emplacement.