Я хочу использовать 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
}