Как убирать клавиатуру при клике на любое место экрана кроме текстового поля?

Помогите написать функцию которая бы реализовала следующую возможность: при клике на EditText клавиатура показывалась, а при клике на любом месте экрана кроме другого EditText убиралась. То есть при переходе из одного EditText в другое клавиатура просто должна оставаться. Пробовал разные варианты кода, но в каждом из-них были какие-то артефакты - или клавиатура закрывалась/открывалась при переходе между EditText или не закрывалась при клике на toolbar'e... Для примера коды: (1)

binding.root.setOnTouchListener { view, event ->
    if (event.action == MotionEvent.ACTION_DOWN) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
    false
}

(2)

val listOfDates = listOf(myEditText1, myEditText2, myEditText3, myEditText4)
    listOfDates.forEach { i ->
        i.onFocusChangeListener = object : View.OnFocusChangeListener {

            override fun onFocusChange(v: View, hasFocus: Boolean) {
                if (hasFocus) {
                    return
                }
                if (!hasFocus) {
                    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                    imm.hideSoftInputFromWindow(v.windowToken, 0)
                }
            }
        }
    }
}

(3)

override fun dispatchTouchEvent(event: MotionEvent): Boolean {
    if (event.action == MotionEvent.ACTION_DOWN) {
        notHideKeyboard()
    }
    return super.dispatchTouchEvent(event)
}

private fun notHideKeyboard() {
val listOfDates = listOf(myEditText1, myEditText2, myEditText3, myEditText4)
    listOfDates.forEach { i ->
        i.onFocusChangeListener = object : View.OnFocusChangeListener {
            override fun onFocusChange(v: View, hasFocus: Boolean) {
                if ((v is EditText) and (hasFocus)) {
                    return
                }
                else ((v !is EditText) and (hasFocus)) {
                    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                    imm.hideSoftInputFromWindow(v.windowToken, 0)
                    return
                }
            }
        }
    }
}

Ответы (0 шт):