【问题标题】:showAsDropDown Gravity parameter not workingshowAsDropDown 重力参数不起作用
【发布时间】:2019-02-05 18:38:27
【问题描述】:

我试图在锚定视图上将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);

这是一个错误还是它不应该被使用?

【问题讨论】:

    标签: android gravity android-popupwindow


    【解决方案1】:

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

    跟踪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)

    【讨论】:

    • tracing through its source 如果我们必须扫描整个源代码堆栈来查找此类信息,那么就有点违背了拥有 javaDoc 和公共文档的目的。尽管如此,它证实了我的观察,所以我很感激帮助。我不想使用您建议的方法,因为它不再遵循锚定视图,这是我不使用该选项的唯一原因。
    • 你说得对,有时文档会缺少关键词,而这些关键词会让世界变得与众不同。
    【解决方案2】:

    这有点晚了,但是如果你想用 showAsDropDown() 使弹出窗口居中,你可以这样做:

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

    在target.post()里面保证我们调用getWidth()的时候anchor被绘制,否则返回0。

    【讨论】:

      【解决方案3】:

      我正在做的是:

      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

      【讨论】:

        猜你喜欢
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 2015-02-03
        • 1970-01-01
        • 2017-07-02
        • 2013-05-28
        • 2013-09-01
        相关资源
        最近更新 更多