【问题标题】:How do Gravity values effect PopupWindow.showAtLocation() in Android重力值如何影响 Android 中的 PopupWindow.showAtLocation()
【发布时间】:2011-09-16 05:00:09
【问题描述】:

不同的重力值如何影响 Android 中的 PopupWindow.showAtLocation()?

我在 PopupWindows showAtLocation 和 Gravity 上找不到好的文档。

【问题讨论】:

    标签: android


    【解决方案1】:

    在尝试了几个小时的黑魔法数学来计算中心并尝试使用 Gravity.TOP 对齐视图之后,我发现了一个使用 Gravity.CENTER 的帖子。我在这里收集我的发现,希望它可以减轻其他人的痛苦。

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

    视图只需要window token,对位置没有其他影响。

    重力告诉布局管理器从哪里开始坐标系以及如何处理这些坐标。我找不到文档,但黑客向我展示了:

    • CENTER 使用弹出窗口的中间与指定的 x,y 对齐。所以 0,0 是屏幕居中的,没有调整通知栏的大小。

    • BOTTOM 使用弹出窗口的底部与指定的 x,y 对齐。所以 0,0 使弹出底部与屏幕底部对齐。如果您想要 10 像素的内边距,则 y=10(不是 -10)将弹出窗口向上移动 10 像素。

    • TOP 使用弹出窗口的顶部与指定的 x,y 对齐。所以 0,0 使弹出窗口顶部与屏幕顶部对齐。如果你想要 10px 的内边距,那么 y=10。 注意如果您未处于全屏模式,则还必须对通知栏进行调整。

    • Gravity.LEFT 和 Gravity.RIGHT 现在应该很明显了,对于我的示例图像,它们太大而无法在屏幕上显示,因此它们被限制为屏幕尺寸减去我正在使用的填充。

    【讨论】:

    • 如果我使用showAsDropDown,如何解决popupwindow被裁剪(出现在屏幕外)的问题?文档说这不应该发生,但确实发生了。我在调用 showAsDropDown 之后和之前尝试了 setClippingEnabled(true),然后是 update(),但存在同样的问题。谢谢
    【解决方案2】:

    您可以通过在showAtLocation 方法中调整Gravity.CENTER 来更改PopupWindow 的重力:

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

    下面的图片展示了效果:

    居中

    • Gravity.CENTER

    边缘

    • Gravity.TOP
    • Gravity.BOTTOM
    • Gravity.LEFT
    • Gravity.RIGHT

    角落

    • Gravity.TOP | Gravity.LEFT
    • Gravity.TOP | Gravity.RIGHT
    • Gravity.BOTTOM | Gravity.LEFT
    • Gravity.BOTTOM | Gravity.RIGHT

    偏移量

    您可以通过更改中的(x,y) 偏移量来进一步定位它

    popupWindow.showAtLocation(anyView, gravity, x, y);
    

    例如

    popupWindow.showAtLocation(anyView, Gravity.BOTTOM, 0, 300);
    

    代码

    这是上述示例的代码。有关更多基本帮助,请参阅 How to make a simple Android popup window

    int gravity = Gravity.CENTER;
    
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View popupView = inflater.inflate(R.layout.popup_window, null);
    int width = LinearLayout.LayoutParams.WRAP_CONTENT;
    int height = LinearLayout.LayoutParams.WRAP_CONTENT;
    boolean focusable = true;
    final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
    popupView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            popupWindow.dismiss();
            return true;
        }
    });
    
    popupWindow.showAtLocation(anyView, gravity, 0, 0);
    

    另见

    • 如果要将弹出窗口锚定到视图,请使用 showAsDropDown

    【讨论】:

    • 如果我使用showAsDropDown,如何解决popupwindow被裁剪(出现在屏幕外)的问题?文档说这不应该发生,但确实发生了。我在调用 showAsDropDown 之后和之前尝试了 setClippingEnabled(true),然后是 update(),但存在同样的问题。谢谢
    • @AshrafAlshahawy,我不确定。我建议您为此提出一个新问题,并包括屏幕截图和您的代码。
    • @AshrafAlshahawy 我有同样的问题。你解决了吗?
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多