Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:点击外部ActionMode对话框时关闭浮动ActionMode_Android_Android Custom View_Android Actionmode - Fatal编程技术网

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()
        )
    }
}