Мои ожидания:
- Как только EditText будет отключен (isEnabled = false) или фокус очищен, он больше не должен получать входные данные.
- Если пользователь нажимает клавиши на аппаратной клавиатуре, я, по крайней мере, должен видеть эти ключевые события в KeyListener EditText
Наблюдаемое поведение
- Я явно отключаю EditText:
searchBox.isEnabled = false - Даже после его отключения:
- Символы, набранные на физической клавиатуре, по-прежнему отображаются внутри EditText
- setOnKeyListener в EditText никогда не вызывается
- Я вижу ключевые события в действии:
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
Log.d("POC", "Key received: ${event.keyCode}")
return super.dispatchKeyEvent(event)
}
- dispatchKeyEvent() нажат
- но EditText все еще обновляет свой текст
- и onKey в EditText никогда не срабатывает
private lateinit var root: LinearLayout
private lateinit var button: Button
private lateinit var loading: TextView
private lateinit var searchBox: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
root = LinearLayout(this).apply {
orientation = LinearLayout.VERTICAL
isFocusable = true
isFocusableInTouchMode = true
}
button = Button(this).apply {
text = "Select Company"
}
loading = TextView(this).apply {
text = "Loading..."
visibility = View.GONE
}
searchBox = EditText(this).apply {
hint = "Search Company"
visibility = View.GONE
}
// Key listener on EditText
searchBox.setOnKeyListener { _, keyCode, event ->
Log.d(
"POC",
"EditText onKey: ${KeyEvent.keyCodeToString(keyCode)}, action=${event.action}"
)
false
}
// Key listener on root container
root.setOnKeyListener { _, keyCode, event ->
Log.d(
"POC",
"Root onKey: ${KeyEvent.keyCodeToString(keyCode)}, action=${event.action}"
)
false
}
root.addView(button)
root.addView(loading)
root.addView(searchBox)
setContentView(root)
button.setOnClickListener {
startFlow()
}
}
private fun startFlow() {
// Remove focus during loading
button.clearFocus()
root.clearFocus()
root.isFocusable = false
root.isFocusableInTouchMode = false
loading.visibility = View.VISIBLE
searchBox.visibility = View.GONE
// Simulate async work
root.postDelayed({
// Restore focusability
root.isFocusable = true
root.isFocusableInTouchMode = true
searchBox.isFocusable = true
searchBox.isFocusableInTouchMode = true
searchBox.isEnabled = true
loading.visibility = View.GONE
searchBox.visibility = View.VISIBLE
// Explicitly give focus to EditText
searchBox.requestFocus()
}, 3000)
// Disable EditText after 8 seconds
searchBox.postDelayed({
Log.d("POC", "Disabling EditText")
searchBox.isEnabled = false
}, 8000)
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
Log.d(
"POC",
"Activity dispatchKeyEvent: code=${event.keyCode}, char='${event.unicodeChar.toChar()}'"
)
return super.dispatchKeyEvent(event)
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -and-onkey
Мобильная версия