web-dev-qa-db-fra.com

Comment montrer PopupWindow à un endroit spécial?

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.

27
Eugene

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.

104
zeetoobiker

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.

7
Yashwanth Kumar

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.

2
ernes7a