我想在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
}