Получить границы просмотра после появления клавиатуры и применения AdjustPan для Android - PullRequest
0 голосов
/ 11 марта 2020

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

Есть ли способ получить реальный вид прямоугольника на экране в отношении смещения, когда клавиатура закрыта или открыта?

1 Ответ

0 голосов
/ 11 марта 2020

Нашел решение, поэтому я использую getLocationInWindow сейчас и добавляю height и width, чтобы выяснить границы. Работает как положено. Если кто-то может объяснить, почему getGlobalVisibleRect и getLocalVisibleRect не работают, пожалуйста, сделайте.

private fun tryCloseKeyboardAndClearFocusFromEditText(focus: View, ev: MotionEvent?) {
        if (focus is TextInputEditText) {
            val location = IntArray(2)
            (focus as? TextInputEditText)?.let{
                it.getLocationInWindow(location)
                val outRect = Rect(location[0], location[1], location[0] + it.width, location[1] + it.height)
                if (!outRect.contains(ev?.rawX?.toInt() ?: 0, ev?.rawY?.toInt() ?: 0)) {
                    closeKeyboard()
                    it.clearFocus()
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...