显示一个居中的PopupWindow。

54

我在我的应用中有一些弹出窗口,它们是全屏的,并且以下是相应的代码:

    content.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    content.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    int screenWidth = windowManager.getDefaultDisplay().getWidth();
    int screenHeight = windowManager.getDefaultDisplay().getHeight();
    int x = screenWidth / 2 - content.getMeasuredWidth() / 2;
    int y = screenHeight / 2 - content.getMeasuredHeight() / 2;
    window.showAtLocation(content, Gravity.NO_GRAVITY, x, y);
使窗口居中显示。
但我有另一个不是全屏的Activity,当弹出窗口打开时,它位于正确的下方,而不是需要的位置。
试图找出为什么会发生这种情况,我认为showAtLocation方法将其相对于当前Activity显示,但我需要相对于显示器显示。
我该怎么做?还是有更简单的方法只让弹出窗口居中显示吗?
2个回答

119
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);

这将使您的视图居中。

我花了两个小时的心血来搞清楚这个问题。我不需要黑魔法数学来处理这个问题。

视图仅对窗口标记需要,对位置没有其他影响。

Gravity 告诉布局管理器从哪里开始坐标系统以及如何处理这些坐标。我找不到文档,但是通过修改代码可以发现:

  • CENTER 将弹出窗口的中心与指定的 x、y 坐标对齐。所以 0,0 是屏幕中心。
  • BOTTOM 将弹出窗口的底部与指定的 x、y 坐标对齐。因此,0,0 具有与屏幕底部对齐的弹出窗口底部。如果您想要 10 像素的填充,则 y=10(而不是 -10)以将弹出窗口向上移动 10 像素。

我在这里写了一篇文章Android PopupWindow.showAtLocation() and effects of Gravity


那么,如果我想要适应底部,我只需要使用这行代码 mPw.showAtLocation(v, Gravity.BOTTOM, 0, 0); 在像 Nexus 5 这样的 xxhpi 设备上可以吗?我在这方面遇到了问题... - Huy Tower
你可以从发布日期看出这是在xxhpi设备之前发布的。你的代码应该按照你的期望执行。点击链接查看我的图片示例,了解不同选项的情况。 - Bae
在 Xamarin Android 中:popupWindow.ShowAtLocation(anyViewOnlyNeededForWindowToken, GravityFlags.Center, 0, 0); - JotaPardo

10
        View popupView = layoutInflater.inflate(R.layout.index_popviewxml,
                null);


        final PopupWindow popupWindow = new PopupWindow(popupView,
                LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, true);



        popupWindow.setTouchable(true);
        popupWindow.setFocusable(true);

        popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);

1
此调用需要API级别19。有没有办法在API级别低于19的情况下执行此操作? - Rushi Ayyappa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接