Android:点击外部ActionMode对话框时关闭浮动ActionMode
我遇到了一个我就是找不到答案的问题 在处理自定义视图中的内联列表组件中的Android:点击外部ActionMode对话框时关闭浮动ActionMode,android,android-custom-view,android-actionmode,Android,Android Custom View,Android Actionmode,我遇到了一个我就是找不到答案的问题 在处理自定义视图中的内联列表组件中的longClick()操作时,我使用的是浮动操作菜单。像这样: 当我显示动作菜单(使用ActionMode.Callback2)时,我无法通过点击动作菜单外的按钮来消除它 我正在寻找一个类似Chrome应用程序的解决方案(见下面的视频): 我尝试过不同的解决方案,例如使用View.onTouch()/MotionEvent.ACTION\u外部,TouchDelegate()和另一种使用registerForContex
longClick()
操作时,我使用的是浮动操作菜单。像这样:
当我显示动作菜单(使用ActionMode.Callback2
)时,我无法通过点击动作菜单外的按钮来消除它
我正在寻找一个类似Chrome应用程序的解决方案(见下面的视频):
我尝试过不同的解决方案,例如使用View.onTouch()
/MotionEvent.ACTION\u外部
,TouchDelegate()
和另一种使用registerForContextMenu()
,但都不起作用
所以我想知道是否有人知道如何制作ActionMode.Callback2
disclose当在它包含的视图之外单击时,任何帮助都将不胜感激。我的ActionMode.Callback2
实现如下所示:
@RequiresApi(Build.VERSION_CODES.M)
class SampleViewItemActionModeCallback private constructor(private val sample: Sample,
private val listener: SampleView.SampleItemClickListener?,
private val touchDelegate: TouchDelegate? = null,
@MenuRes private var menuResId: Int = 0,
private var contentLeft: Int = 0,
private var contentTop: Int = 0,
private var contentRight: Int = 0,
private var contentBottom: Int = 0)
: ActionMode.Callback2() {
private var mode: ActionMode? = null
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
this.mode = mode
mode.menuInflater.inflate(menuResId, menu)
return true
}
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
return false
}
override fun onDestroyActionMode(mode: ActionMode) {
this.mode = null
}
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_edit -> {
listener?.onSampleEditClick(sample)
mode.finish()
true
}
R.id.action_delete -> {
listener?.onSampleDeleteClick(sample)
mode.finish()
true
}
else -> {
mode.finish()
false
}
}
}
override fun onGetContentRect(mode: ActionMode, view: View, outRect: Rect) {
outRect.set(contentLeft, contentTop, contentRight, contentBottom)
view.touchDelegate
view.setOnTouchListener { v, event ->
Timber.i("Event: ${event.actionMasked} happened inside view: ${isMotionEventInsideView(v, event)}. Parent is: ${v.parent}")
true
}
}
companion object {
operator fun invoke(view: SampleView,
listener: SampleView.SampleItemClickListener?,
touchDelegate: TouchDelegate? = null,
@MenuRes menuResId: Int,
contentLeft: Int = 0,
contentTop: Int = 0,
contentRight: Int = view.width,
contentBottom: Int = view.height): ActionMode {
val callback = SampleViewItemActionModeCallback(
sample = checkNotNull(view.sample),
listener = listener,
touchDelegate = touchDelegate,
menuResId = menuResId,
contentLeft = contentLeft,
contentTop = contentTop,
contentRight = contentRight,
contentBottom = contentBottom
)
return view.startActionMode(callback, ActionMode.TYPE_FLOATING)
}
}
private fun isMotionEventInsideView(view: View, event: MotionEvent): Boolean {
val viewRect = Rect(
view.left,
view.top,
view.right,
view.bottom
)
return viewRect.contains(
view.left + event.x.toInt(),
view.top + event.y.toInt()
)
}
}