我正在尝试将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);
这是一个错误还是不是应该使用的方式?
对于PopupWindow.showAsDropDown()
,似乎正在按预期方式工作,通过其源进行跟踪,您最终可以看到引力参数仅用于horizontal值。
从gravity
到PopupWindow.showAsDropDown()跟踪PopupWindow.findDropDownPosition()的值,我们已经可以看到提示@param gravity horizontal gravity specifying popup alignment
然后再往Gravity.getAbsoluteGravity()前进也暗示了@param gravity The gravity to convert to absolute (horizontal) values.
这件事
但是我相信您要实现的目标是使用Show a PopupWindow centralized的PopupWindow.showAtLocation()
PopupWindow.showAtLocation(View parent, int gravity, int x, int y)
这有点晚了,但是如果您想使用showAsDropDown()将弹出窗口居中,则可以这样做:
target.post(() -> {
popupWindow.showAsDropDown(anchor, (anchor.getWidth() / 2), yOffset, Gravity.CENTER);
});
它在target.post()内部,以确保在调用getWidth()时绘制锚点,否则返回0。