在Dialog或DialogFragment中是否有与Activity中的dispatchTouchEvent()等效的方法?

7

我需要拦截应用程序中的所有触摸事件,以监视自定义活动超时。

目前我在我的活动中使用dispatchTouchEvent(),但是如果屏幕上有对话框,则不会调用此函数。 有没有人知道是否有办法在存在对话框的情况下实现相同的功能?

谢谢


你有没有得到过答案? - TorukMakto
没有,我已经不再参与这个项目了。 - draksia
@draksia @Jailbroken 我尝试过这个方法,我在Dialog的dispatchTouchEvent()中调用了Activity的dispatchTouchEvent()。然而,我发现这对于ListView和GridView的OnItemClickListener不起作用,即您不会收到任何回调(仅适用于某些设备)。但是,所有其他视图和布局都可以正常工作! - Abbas
@Abbas,有没有解决这个问题的办法? - kishan verma
2个回答

9

为在 DialogFragment 中使用 dispatchTouchEvent(),请重写 onCreateDialog 并返回一个带有 dispatchTouchEvent 的自定义 Dialog (在您的自定义 DialogFragment 中)。

例如,当在 DialogFragment 外部单击以关闭键盘时:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(getActivity(), getTheme()) {
        @Override
        public boolean dispatchTouchEvent(@NonNull MotionEvent motionEvent) {
            if (getCurrentFocus() != null) {
                InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
            }
            return super.dispatchTouchEvent(motionEvent);
        }

    };
}

2

大家好,这里提供了Kotlin版本的代码:

abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return object : Dialog(requireContext()){
            override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
                // do your thing here
                return super.dispatchTouchEvent(ev)
            }
        }
    }

}

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