如何在特殊位置显示PopupWindow?

时间:2011-09-16 22:18:54

标签: android popupwindow

我需要在屏幕上显示的PopupWindow下显示Views

如何计算所需View的坐标并在其下放置PopupWindow?代码示例非常受欢迎。感谢。

3 个答案:

答案 0 :(得分:102)

找到已经显示的视图非常简单 - 这就是我在代码中使用的内容:

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

然后你可以使用类似于Ernesta建议的代码将弹出窗口粘贴在相关位置:

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

这会直接在原始视图下显示弹出窗口 - 不能保证会有足够的空间来显示视图。

答案 1 :(得分:7)

您有getLeft()getBottom()来获取布局中视图的确切位置。您还可以getWidth()getHeight()了解视图占用的确切空间。如果要将弹出窗口放在视图下方。

视图的setLeft()setTop()方法可以定位新的弹出窗口。

答案 2 :(得分:2)

要获取主应用程序屏幕的大小而没有标题和通知栏之类的内容,请在生成相关屏幕的类中覆盖以下方法(大小以像素为单位):

@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()将父视图作为参数与重力和位置偏移一起使用。