showAsDropDown Gravity参数不起作用

时间:2019-02-05 18:38:28

标签: android gravity android-popupwindow

我正在尝试将PopUpWindow的水平居中定位视图,但Gravity.CENTER参数被忽略了。

这是我使用的方法:

popupWindow.showAsDropDown(anchorView, 0, 0, Gravity.CENTER);

无论我输入什么CENTER重力值(TOP或BOTTOM也不起作用),弹出窗口始终显示在同一位置:锚点的左上角,除非我使用START或END值。

文档和javaDoc并未列出对其接受的值的任何限制,因此我假设它也接受任何CENTER,TOP和BOTTOM值:https://developer.android.com/reference/android/widget/PopupWindow#showAsDropDown(android.view.View,%20int,%20int,%20int)

我还使用比弹出窗口更小,相等和更大的锚点视图对此进行了测试,并且弹出窗口设置为未按预期填充屏幕宽度。

该方法似乎与没有重力参数的等效方法没有什么不同

popupWindow.showAsDropDown(anchorView, 0, 0);

这是一个错误还是不是应该使用的方式?

2 个答案:

答案 0 :(得分:1)

对于PopupWindow.showAsDropDown(),似乎可以按预期工作,并且可以追溯其来源,最终您可以看到引力参数仅用于水平值。

跟踪gravityPopupWindow.showAsDropDown()PopupWindow.findDropDownPosition()的值,我们已经可以看到提示@param gravity horizontal gravity specifying popup alignment

然后再深入Gravity.getAbsoluteGravity()也会暗示@param gravity The gravity to convert to absolute (horizontal) values.的同一事物

但是我相信您要实现的目标是使用PopupWindow.showAtLocation()的{​​{3}}

Show a PopupWindow centralized

答案 1 :(得分:0)

这有点晚了,但是如果要使用showAsDropDown()将弹出窗口居中,则可以执行以下操作:

target.post(() -> {
        popupWindow.showAsDropDown(anchor, (anchor.getWidth() / 2), yOffset, Gravity.CENTER);
    });

在target.post()内部,以确保在调用getWidth()时绘制锚点,否则返回0。