Android - PopupWindow在特定视图之上

时间:2013-05-29 15:33:04

标签: android popupwindow

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

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

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

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

9 个答案:

答案 0 :(得分:36)

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

您真正想要使用的是:

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

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

popupWindow.showAsDropdown(anchor, offsetX, offsetY);

这些调用显示相对于指定锚点视图的弹出窗口。请注意,默认引力(在没有指定重力的情况下调用时)为Gravity.TOP|Gravity.START,因此,如果您在应用中的各个位置明确使用Gravity.LEFT,那么您将度过一段美好时光:)

答案 1 :(得分:6)

popupWindow.showAtLocation(anchor, Gravity.BOTTOM, 0, anchor.getHeight());

答案 2 :(得分:5)

您要使用的是showAtLocation(...)。您可以指定锚点视图(用户单击的视图),并通过gravity参数和偏移量将其相对于该视图定位。可以想象gravity参数,如PopupWindow几乎就像子视图,父视图就像容器布局。

您应该能够将Gravity.LEFT | Gravity.TOP作为参数。

答案 3 :(得分:5)

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

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

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

答案 4 :(得分:5)

我有这个代码: PopupWindow在特定视图(Gravity End)下面,适用于所有sdk版本。

        // 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 Calendar。

答案 5 :(得分:4)

我编写了一个示例 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
        )
    }
}

答案 6 :(得分:3)

您可以通过以下

在锚点上方显示弹出窗口
popupWindow.showAsDropDown(anchor, 0, -anchor.getHeight()-popupView.getHeight);

答案 7 :(得分:2)

示例:

.iloc[:1,:]

答案 8 :(得分:0)

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