Android 如何在特殊位置显示PopupWindow?
我需要在屏幕上显示的一个视图下显示Android 如何在特殊位置显示PopupWindow?,android,popupwindow,Android,Popupwindow,我需要在屏幕上显示的一个视图下显示PopupWindow 如何计算所需的视图的坐标并将弹出窗口放置在其下方?代码示例非常受欢迎。谢谢。您有getLeft()和getBottom()来获取视图在布局中的确切位置。您还可以使用getWidth()和getHeight()来了解视图所占用的确切空间。如果要将弹出窗口定位在视图下方 您可以使用视图的setLeft()和setTop()方法定位新的弹出窗口 若要获取主应用程序屏幕的大小,而不包含标题和通知栏之类的内容,请在生成相关屏幕的类中重写以下方法(大
PopupWindow
如何计算所需的视图的坐标
并将弹出窗口
放置在其下方?代码示例非常受欢迎。谢谢。您有getLeft()
和getBottom()
来获取视图在布局中的确切位置。您还可以使用getWidth()
和getHeight()
来了解视图所占用的确切空间。如果要将弹出窗口定位在视图下方
您可以使用视图的
setLeft()
和setTop()
方法定位新的弹出窗口 若要获取主应用程序屏幕的大小,而不包含标题和通知栏之类的内容,请在生成相关屏幕的类中重写以下方法(大小以像素为单位):
要获取要显示弹出窗口的视图的底部坐标,请执行以下操作:
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()
将父视图与重力和位置偏移一起作为参数。定位已显示的视图相当容易-以下是我在代码中使用的内容:
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);
这将直接显示在原始视图下的弹出窗口——但不能保证有足够的空间显示视图。
只有当代码>按钮<代码>在屏幕中间时,才会起作用。即使我手动设置偏移量
,这也无法在不同的屏幕大小上工作。按钮
可以无处不在。等等-因此我建议的解决方案会在按钮下方显示弹出窗口。如果将按钮放低,弹出窗口也会显示得更低。由于我认为弹出窗口占据了整个屏幕的宽度,所以按钮是否水平居中并不重要。还是我遗漏了什么?很好,View.getBottom()。但代码中有一个小问题。我已经在编辑部分+1中为这段非常有用的代码添加了这一更改。对不起,我不能做更多;)+1只需要添加一些内容,首先最好只使用重力。不使用重力,然后如果您希望有一个边距,以便弹出窗口不在边缘,您可以减去(例如location.left-50)。请记住,在使用location.right时,您需要测量弹出窗口的宽度。对于弹出窗口测量,请转到此处。带边距窗口的最终代码:location.left-PopupUpindowWidth-50此解决方案是否适用于RTL布局?若并没有,需要进行哪些修改才能使其在从右到左的配置下工作?@A.B.您需要处理RTL的条件。以上反映了两种布局的相同之处,即RTL和LTR。@zeetoobiker您的解决方案工作得非常完美!但我使用的是SwitcherView内部弹出窗口。所以在切换视图后,它会改变弹出窗口的位置。有什么想法吗?你能举个例子吗?
popup.showAtLocation(parent, Gravity.TOP|Gravity.LEFT, location.left, location.bottom);