按照与PopupMenu相同的方式关闭PopupWindow:通过在其外部单击即可关闭PopupMenu。

3
我正在为平板开发一款Android应用程序。当用户点击设置按钮时,我希望在屏幕的右上方显示一个对话框,以便进行配置设置。
考虑到该对话框比较复杂,我认为使用PopupWindow比使用PopupMenu更为合适。PopupMenu有一个很好的行为习惯,即当用户在菜单外面点击时自动关闭弹出窗口。那么我如何让PopupWindow表现得与之相同呢?
            val popupView = layoutInflater.inflate(R.layout.popup_window, null)
            val popupWindow = PopupWindow(
                popupView,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
            )
            popupWindow.showAsDropDown(appCompactImageButton, 20, 0)

3
这个问题看起来与这个链接中的问题类似:https://dev59.com/FWct5IYBdhLWcg3wPbMm需求翻译为:请问如何实现点击PopupWindow外部时自动dismiss? - Róbert Polovitzer
3个回答

4

您只需设置PopupWindowsetBackgroundDrawablesetOutsideTouchable属性,即可在触摸窗口外部时关闭该窗口。

PopupWindow popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable());
popupWindow.setOutsideTouchable(true);

注意:在调用popupWindow.showAsDropDown之前调用set...似乎很重要。 - Christian
是的,如果您在调用popupWindow.showAsDropDown之后调用这些属性,则必须调用popupWindow.update() - Priyanka

1

// 当触摸窗口外部时关闭弹出窗口。

mPopupWindow.setOutsideTouchable(true);

//将焦点设置为弹出窗口,这样当触摸它时可以关闭窗口

mPopupWindow.setFocusable(true);

// 如果您想要移除默认背景。

mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

setOutsideTouchable(boolean touchable) 控制弹出窗口是否会响应其窗口之外的触摸事件。

setFocusable(boolean focusable) 改变弹出窗口的焦点能力。

setBackgroundDrawable(Drawable background) 指定此弹出窗口的背景可绘制对象。


0

我发现当你点击外部或者返回按钮时,PopupMenu 会关闭。因此,如果想让 PopupWindowPopupMenu 一样可以被关闭,你应该使用

popupWindow.isFocusable = true
// or you can send focusable when initialize PopupWindow because they have constructor like PopupWindow(View contentView, int width, int height, boolean focusable) 

您可以在这里查看我的完整答案,了解为什么我们应该使用 isFocusable


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接