Как показать PopupWindow в специальном месте? - PullRequest
27 голосов
/ 17 сентября 2011

Мне нужно показать PopupWindow под одним Views, показанным на экране.

Как я могу рассчитать координаты необходимого View и поместить PopupWindow под ним?Пример кода приветствуется.Спасибо.

Ответы [ 3 ]

102 голосов
/ 21 сентября 2011

Найти уже отображаемое представление довольно просто - вот что я использую в своем коде:

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;
}

Затем вы можете использовать код, подобный тому, что Эрнеста предложил прикрепить всплывающее окно в соответствующем месте:

popup.showAtLocation(parent, Gravity.TOP|Gravity.LEFT, location.left, location.bottom);

Это показало бы всплывающее окно непосредственно под исходным видом - хотя нет гарантии, что будет достаточно места для отображения вида.

7 голосов
/ 17 сентября 2011

у вас есть getLeft() и getBottom(), чтобы получить точную позицию вида в макете. У вас также есть getWidth() и getHeight(), чтобы узнать точное пространство, занимаемое видом. Если вы хотите расположить всплывающее окно под видом.

Вы setLeft() и setTop() методы представления для размещения нового всплывающего окна.

2 голосов
/ 20 сентября 2011

Чтобы получить размер основного экрана приложения без таких вещей, как заголовок и панели уведомлений, переопределите следующий метод в классе, генерирующем рассматриваемый экран (размеры измеряются в пикселях):

@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
}

Чтобы получитьнижняя координата представления, в котором вы хотите отобразить всплывающее окно:

View upperView = ...
int coordinate = upperView.getBottom();

Теперь, пока height - coordinate достаточно велико для вашего всплывающего представления, вы можете просто разместить всплывающее окно следующим образом:*

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);
    }
});

Здесь showAtLocation() принимает родительское представление в качестве аргумента вместе со смещением гравитации и местоположения.

...