showAsDropDown 重力参数不起作用
showAsDropDown Gravity parameter not working
我试图在锚定视图上水平居中 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)
我还使用小于、等于和大于弹出窗口 window 的锚视图对此进行了测试,并且弹出窗口 window 设置为不按预期填充屏幕宽度.
看起来这个方法与不带重力参数的等效方法没有什么不同
popupWindow.showAsDropDown(anchorView, 0, 0);
这是一个错误还是这不是应该的使用方式?
对于PopupWindow.showAsDropDown()
,似乎是按预期工作的,追根溯源,你最终可以看到重力参数仅适用于水平值。
从PopupWindow.showAsDropDown() to PopupWindow.findDropDownPosition()追踪gravity
的值,我们已经可以看到提示@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() 使弹出 window 居中,你可以这样做:
target.post(() -> {
popupWindow.showAsDropDown(anchor, (anchor.getWidth() / 2), yOffset, Gravity.CENTER);
});
在target.post()里面保证我们调用getWidth()时锚点被绘制出来,否则returns0.
我正在做的是:
fun showPopupWindow(popupWindow : PopupWindow){
popupWindow.width = 200
popupWindow.height = ViewGroup.LayoutParams.WRAP_CONTENT
popupWindow.showAsDropDown(anchor, -(popupWindow.width - anchor.width)/2, 0, Gravity.CENTER)
}
确保 popupWindow.width 和 anchor.width 不是 0、-1 或 -2
我试图在锚定视图上水平居中 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)
我还使用小于、等于和大于弹出窗口 window 的锚视图对此进行了测试,并且弹出窗口 window 设置为不按预期填充屏幕宽度.
看起来这个方法与不带重力参数的等效方法没有什么不同
popupWindow.showAsDropDown(anchorView, 0, 0);
这是一个错误还是这不是应该的使用方式?
对于PopupWindow.showAsDropDown()
,似乎是按预期工作的,追根溯源,你最终可以看到重力参数仅适用于水平值。
从PopupWindow.showAsDropDown() to PopupWindow.findDropDownPosition()追踪gravity
的值,我们已经可以看到提示@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() 使弹出 window 居中,你可以这样做:
target.post(() -> {
popupWindow.showAsDropDown(anchor, (anchor.getWidth() / 2), yOffset, Gravity.CENTER);
});
在target.post()里面保证我们调用getWidth()时锚点被绘制出来,否则returns0.
我正在做的是:
fun showPopupWindow(popupWindow : PopupWindow){
popupWindow.width = 200
popupWindow.height = ViewGroup.LayoutParams.WRAP_CONTENT
popupWindow.showAsDropDown(anchor, -(popupWindow.width - anchor.width)/2, 0, Gravity.CENTER)
}
确保 popupWindow.width 和 anchor.width 不是 0、-1 或 -2