Как переопределить dispatchTouchEvent во фрагменте - PullRequest
0 голосов
/ 11 марта 2019

Я хочу использовать 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...