背景
由于官方不支持自定义视图或图标的上下文菜单行(这里),我决定创建自己的解决方案(即类似其功能的自定义视图)。
问题
在RecyclerView上使用上下文菜单时,触摸位置很重要。 因此,如果你长按一个项目,则上下文菜单将尝试出现在接近触摸位置的位置(取自这里示例),而我没有通过OnClickListener或onLongClickListener提供此信息:
但是,我找不到如何在更基本的类中完成此操作。
我尝试过的
可以通过长按触发PopupWindow的显示,如下所示:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(context)
val holder = ViewHolder(inflater.inflate(R.layout.list_item_main, parent, false))
holder.itemView.setOnLongClickListener {
val contextMenuView=inflater.inflate(R.layout.context_menu,null)
val popupWindow = PopupWindow(contextMenuView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true)
popupWindow.showAsDropDown(holder.itemView,0,0);
true
}
return holder
}
如果你想要一个漂亮的背景而不是透明的,你可以使用ListPopupWindow的解决方法。如果你不需要列表,你只需要设置它的promptView ,代码如下(可在这里找到):
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(context)
val holder = ViewHolder(inflater.inflate(R.layout.list_item_main, parent, false))
val maxAllowedPopupWidth = context.resources.displayMetrics.widthPixels * 90 / 100
holder.itemView.setOnLongClickListener {
val contextMenuView = inflater.inflate(R.layout.context_menu, null)
val listPopupWindow = ListPopupWindow(context)
contextMenuView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
val width = min(maxAllowedPopupWidth, contextMenuView.measuredWidth)
listPopupWindow.setPromptView(contextMenuView)
listPopupWindow.setContentWidth(width)
listPopupWindow.anchorView = it
listPopupWindow.show()
true
}
return holder
}
我对我计算出的最大宽度不确定,因为我找不到弹出窗口的最大尺寸。我知道上下文菜单有一些最大值,然后由于某种原因它截断了文本。也许它和Dialog是一样的?除了对话框我找到了一个最大宽度,但我只找到了一个最小宽度:windowMinWidthMajor
和windowMinWidthMinor
。
但回到问题:我在这里找不到任何与将弹出窗口放置在接触位置附近有关的函数。
所以这就是我得到的例子:
问题
如何设置弹出窗口出现在屏幕接触位置附近,而无需处理onTouch事件,就像使用ContextMenu时所做的那样?
上下文菜单(或类似菜单)是否有一些属性可以获取,以设置为我显示的最大大小(简而言之:默认最大宽度)?如果有,我该如何使用它?如何设置宽度和高度来考虑充气视图的尺寸?