dispatchTouchEvent() 在对话框和菜单的情况下不起作用

问题描述 投票:0回答:1

我正在尝试使用视图以编程方式执行单击。

如果它是按钮、文本或列表,我可以在普通 UI 上实现此目的。

这是我的代码..

element.GetView().getRootView().dispatchTouchEvent(mMotionEvent);

在正常窗口的情况下,这工作正常。 但是当涉及到对话框列表和菜单项时,它不起作用

我正在尝试使用视图以编程方式执行单击。

如果它是按钮、文本或列表,我可以在普通 UI 上实现此目的。

这是我的代码..

element.GetView().getRootView().dispatchTouchEvent(mMotionEvent);

在正常窗口的情况下,这工作正常。 但是当涉及到对话框列表和菜单项时,它不起作用

这是类名,其中包含附加到对话框的单选按钮列表。

androidx.appcompat.app.AlertController$RecycleListView

这是类名,其中包含附加到对话框的菜单项列表。

android.widget.PopupWindow$PopupBackgroundView

android android-studio listview touch-event android-viewgroup
1个回答
0
投票

我曾经使用点击事件来检查应用程序的空闲状态。我希望这个解决方案有帮助。

要处理触摸事件,您可以创建自定义对话框窗口回调。

class UserInteractionAwareCallback(
        private val wrapped: Callback,
        private val onUserInteraction: () -> Unit
    ) : Callback{
        override fun dispatchKeyEvent(p0: KeyEvent?): Boolean {
            return wrapped.dispatchKeyEvent(p0)
        }

        override fun dispatchKeyShortcutEvent(p0: KeyEvent?): Boolean {
            return wrapped.dispatchKeyShortcutEvent(p0)
        }

        override fun dispatchTouchEvent(p0: MotionEvent?): Boolean {
            if(p0?.action == MotionEvent.ACTION_DOWN){
                onUserInteraction.invoke()
            }

            return wrapped.dispatchTouchEvent(p0)
        }

        override fun dispatchTrackballEvent(p0: MotionEvent?): Boolean {
            return wrapped.dispatchTrackballEvent(p0)
        }

        override fun dispatchGenericMotionEvent(p0: MotionEvent?): Boolean {
            return wrapped.dispatchGenericMotionEvent(p0)
        }

        override fun dispatchPopulateAccessibilityEvent(p0: AccessibilityEvent?): Boolean {
            return wrapped.dispatchPopulateAccessibilityEvent(p0)
        }

        override fun onCreatePanelView(p0: Int): View? {
            return wrapped.onCreatePanelView(p0)
        }

        override fun onCreatePanelMenu(p0: Int, p1: Menu): Boolean {
            return wrapped.onCreatePanelMenu(p0, p1)
        }

        override fun onPreparePanel(p0: Int, p1: View?, p2: Menu): Boolean {
            return wrapped.onPreparePanel(p0, p1, p2)
        }

        override fun onMenuOpened(p0: Int, p1: Menu): Boolean {
            return wrapped.onMenuOpened(p0, p1)
        }

        override fun onMenuItemSelected(p0: Int, p1: MenuItem): Boolean {
            return wrapped.onMenuItemSelected(p0, p1)
        }

        override fun onWindowAttributesChanged(p0: WindowManager.LayoutParams?) {
            wrapped.onWindowAttributesChanged(p0)
        }

        override fun onContentChanged() {
            wrapped.onContentChanged()
        }

        override fun onWindowFocusChanged(p0: Boolean) {
            wrapped.onWindowFocusChanged(p0)
        }

        override fun onAttachedToWindow() {
            wrapped.onAttachedToWindow()
        }

        override fun onDetachedFromWindow() {
            wrapped.onDetachedFromWindow()
        }

        override fun onPanelClosed(p0: Int, p1: Menu) {
            wrapped.onPanelClosed(p0, p1)
        }

        override fun onSearchRequested(): Boolean {
            return wrapped.onSearchRequested()
        }

        override fun onSearchRequested(p0: SearchEvent?): Boolean {
            return wrapped.onSearchRequested(p0)
        }

        override fun onWindowStartingActionMode(p0: ActionMode.Callback?): ActionMode? {
            return wrapped.onWindowStartingActionMode(p0)
        }

        override fun onWindowStartingActionMode(p0: ActionMode.Callback?, p1: Int): ActionMode? {
            return wrapped.onWindowStartingActionMode(p0, p1)
        }

        override fun onActionModeStarted(p0: ActionMode?) {
            wrapped.onActionModeStarted(p0)
        }

        override fun onActionModeFinished(p0: ActionMode?) {
            wrapped.onActionModeFinished(p0)
        }
    }

在 onViewCreated 方法中创建自定义回调函数。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        dialog?.window?.callback = UserInteractionAwareCallback(dialog?.window?.callback!!){
            // Do something here
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.