Я использую обходной путь, чтобы определить, был ли щелчок вне EditText для выполнения некоторой логики c. Когда пользователь нажимает на EditText, появляется клавиатура. windowSoftInputMode
установлен на adjustPan
. Таким образом, проблема в том, что я вижу, что границы представления не пересчитываются после того, как содержимое помещено на страницу. Он по-прежнему возвращает предыдущие границы с закрытой клавиатурой.
Итак, вот код, который я использую
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
currentFocus?.let {
tryCloseKeyboardAndClearFocusFromEditText(currentFocus as View, ev)
}
return super.dispatchTouchEvent(ev)
}
private fun tryCloseKeyboardAndClearFocusFromEditText(focus: View, ev: MotionEvent?) {
if (focus is TextInputEditText) {
val outRect = Rect()
(focus as? TextInputEditText)?.getGlobalVisibleRect(outRect)
if (!outRect.contains(ev?.rawX?.toInt() ?: 0, ev?.rawY?.toInt() ?: 0)) {
closeKeyboard()
(focus as? TextInputEditText)?.clearFocus()
}
}
}
Так что getGlobalVisibleRec
всегда возвращает одни и те же значения, независимо от того, открыта или закрыта клавиатура, а содержимое на экране фактически было нажато вверх. Координаты MotionEvent равны 100, 400, например, и EditText показывает событие 60, 490, например, хотя я нажимаю непосредственно на него.
Есть ли способ получить реальный вид прямоугольника на экране в отношении смещения, когда клавиатура закрыта или открыта?