首页 > 解决方案 > 如何在 Fragment 中覆盖 dispatchTouchEvent

问题描述

我想在创建dispatchTouchEvent的众多之一中使用. 问题是在其他片段中引起一些问题,所以我想让它只在单个片段中激活,但没有这种类型的功能。FragmentsActivitydispatchTouchEventFragment

有什么方法可以在 Fragment 中实现它吗?

我需要这个功能,因为我有问题,如果我为我的片段根视图(键盘仍然可见并且仍然集中)EditTexts,他们拒绝失去焦点。话虽如此,我在 stackOverflow 上发现了“神奇”功能,可以解决我应用程序中任何地方的焦点问题:onClickListenerEditTexts

“魔法功能”:

override fun dispatchTouchEvent(event: MotionEvent): Boolean {
    if (event.action == MotionEvent.ACTION_DOWN) {
        val v = currentFocus
        if (v is EditText) {
            val outRect = Rect()
            v.getGlobalVisibleRect(outRect)
            if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
                v.clearFocus()
                val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
                    imm!!.hideSoftInputFromWindow(v.getWindowToken(), 0)
            }
        }
    }
    return super.dispatchTouchEvent(event)
}

我试图制作一些充当触摸检测器的拦截器View(例如)。FrameLayout然后我添加onTouchListener并使用了与函数类似的代码dispatchTouchEvent。但这不起作用。我也尝试将 onTouchListener 应用于我的片段rootView,但结果相同。

示例(在这种情况下,拦截器位于FrameLayout我的整个布局中):

interceptor.setOnTouchListener { _, event ->

    if (event.action == MotionEvent.ACTION_DOWN) {
        val view = activity?.currentFocus
        if (view is EditText) {

            val outRect = Rect()
            view.getGlobalVisibleRect(outRect)
            if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
                view.clearFocus()
                val imm = view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
                imm!!.hideSoftInputFromWindow(view.getWindowToken(), 0)
            }
        }
    }
    false
}

标签: androidandroid-layoutandroid-fragmentskotlin

解决方案


推荐阅读