【发布时间】:2011-09-16 22:18:53
【问题描述】:
我需要在屏幕上显示的Views 下显示PopupWindow。
如何计算所需View 的坐标并将PopupWindow 置于其下?代码示例非常受欢迎。谢谢。
【问题讨论】:
标签: android popupwindow
我需要在屏幕上显示的Views 下显示PopupWindow。
如何计算所需View 的坐标并将PopupWindow 置于其下?代码示例非常受欢迎。谢谢。
【问题讨论】:
标签: android popupwindow
定位已显示的视图相当容易 - 这是我在代码中使用的:
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);
这将直接在原始视图下方显示弹出窗口 - 但不能保证有足够的空间来显示视图。
【讨论】:
你有getLeft() 和getBottom() 来获取视图在布局中的确切位置。您还可以通过getWidth() 和getHeight() 了解视图占用的确切空间。如果要将弹出窗口放置在视图下方。
您使用视图的setLeft() 和setTop() 方法来定位新的弹出窗口。
【讨论】:
要获取主应用程序屏幕的大小,而不需要标题和通知栏等内容,请在生成相关屏幕的类中覆盖以下方法(大小以像素为单位):
@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() 将父视图与重力和位置偏移一起作为参数。
【讨论】:
button 位于屏幕中间时有效。即使我手动设置offset,这也不适用于不同的屏幕尺寸。
button 可以无处不在。