30

我正在为 Android 开发一个应用程序,当用户单击屏幕底部的特定菜单栏对象(由水平排列的小图像组成)时,我正在使用一个弹出窗口。

在单击时,我希望弹出窗口锚定到被单击视图的左上角并显示在顶部。

似乎相关的唯一方法是showAsDropDown(View anchor, int xoff, int yoff)showAtLocation(View parent, int Gravity, int x, int y)。showAsDropDown 的问题在于它锚定在视图的左下角。

还有其他方法可以实现吗?

4

10 回答 10

43

popupWindow.showAtLocation(...)实际上显示了绝对定位在屏幕上的窗口(甚至不是应用程序)。该调用中的锚点仅用于其窗口令牌。坐标是从给定重力的偏移量。

你真正想要使用的是:

popupWindow.showAsDropDown(anchor, offsetX, offsetY, gravity);

此调用仅在 API 19+ 中可用,因此在早期版本中您需要使用:

popupWindow.showAsDropdown(anchor, offsetX, offsetY);

这些调用显示相对于指定锚点视图的弹出窗口。请注意,默认重力(在没有指定重力的情况下调用时)是Gravity.TOP|Gravity.START这样的,如果您Gravity.LEFT在应用程序的各个位置明确使用,您将有一个糟糕的时间:)

于 2015-03-26T17:24:47.933 回答
10

您只需使用showAsDropDown(View anchor, int xoff, int yoff)语法中的yoff参数将popupWindow 移动其锚点的高度。

popupWindow.showAsDropDown(anchor, 0, -anchor.getHeight()+popupView.getHeight);

另外,请注意,如果允许锚定的最大高度不允许转换,则弹出窗口可能无法正确显示。

于 2016-04-06T16:07:05.140 回答
8

我编写了一个示例 Kotlin 代码,它将PopupWindow在锚视图上方显示一个。

private fun showPopupWindow(anchor: View) {
    PopupWindow(anchor.context).apply {
        isOutsideTouchable = true
        val inflater = LayoutInflater.from(anchor.context)
        contentView = inflater.inflate(R.layout.popup_layout, null).apply {
            measure(
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
            )
        }
    }.also { popupWindow ->
        // Absolute location of the anchor view
        val location = IntArray(2).apply {
            anchor.getLocationOnScreen(this)
        }
        val size = Size(
            popupWindow.contentView.measuredWidth,
            popupWindow.contentView.measuredHeight
        )
        popupWindow.showAtLocation(
            anchor,
            Gravity.TOP or Gravity.START,
            location[0] - (size.width - anchor.width) / 2,
            location[1] - size.height
        )
    }
}
于 2021-01-11T19:16:23.210 回答
7
popupWindow.showAtLocation(anchor, Gravity.BOTTOM, 0, anchor.getHeight());
于 2014-11-15T09:28:19.110 回答
6

我有这个代码:所有sdk版本的特定视图(Gravity End)下方的PopupWindow。

        // display the popup[![enter image description here][1]][1]
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            mPopupWindow.showAsDropDown(v, 0, 0, Gravity.END);
        } else {
            mPopupWindow.showAsDropDown(v, v.getWidth() - mPopupWindow.getWidth(), 0);
        }

这里 View v 是 ImageButton 日历。

于 2017-03-16T04:00:18.173 回答
5

您要使用的是showAtLocation(...). 您指定锚视图(用户单击的那个),并通过gravity参数和偏移量相对于该视图定位它。想想像这样的gravity参数PopupWindow几乎就像一个子视图,而父视图就像一个容器布局。

您应该可以将Gravity.LEFT | Gravity.TOP其作为参数。

于 2013-05-29T16:01:59.170 回答
4

您可以通过以下方式始终在锚点上方显示弹出窗口

popupWindow.showAsDropDown(anchor, 0, -anchor.getHeight()-popupView.getHeight);
于 2018-03-14T08:11:53.447 回答
3

示例:

ScrollView scrollView = new ScrollView(context);
popupWindow.setContentView(scrollView);
scrollView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),                 
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
int he=scrollView.getMeasuredHeight();
popupWindow.showAsDropDown(items,0, -items.getHeight()-he);
于 2020-09-19T06:19:32.067 回答
0

在使用了这么多解决方案之后,我得到了一种解决方案,可以在Kotlin的任何View上方显示PopupWindow

要在视图上方显示弹出窗口,可以使用showAsDropDown()函数。

popUp.showAsDropDown(v, 0, (-0.2 * v.height).roundToInt(), Gravity.CENTER)

和:

  • v:视图(锚)
  • 0: offSetX
  • (-0.2 * v.height).roundToInt(): offSetY
  • Gravity.CENTER:重力

例如:https ://medium.com/@bhattmeet887/popupwindow-above-the-specific-view-kotlin-ab1a199581eb

于 2021-10-25T09:35:36.527 回答
-5

popupwindow.showAsDropDown(anchor,0, -125); 这东西对我有用

于 2013-07-24T13:50:06.303 回答