如何在Fragment中覆盖dispatchTouchEvent

时间:2019-03-11 09:15:43

标签: android android-layout android-fragments kotlin

我想在dispatchTouchEvent中创建的众多Fragments中使用Activity。问题是dispatchTouchEvent导致在关注其他片段时出现了一些问题,因此我只想让它在单个片段中处于活动状态,但是Fragment没有这种类型的功能。

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

我需要此功能,因为我遇到EditTexts的问题,并且如果我为片段根视图制作了onClickListener(键盘仍然可见并且EditTexts仍然存在,他们拒绝放宽焦点)集中)。话虽这么说,我在stackOverflow上发现了“魔术”功能,可以解决我应用程序中任何地方的焦点问题:

“魔术功能”:

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
}

0 个答案:

没有答案