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