EditText по-прежнему получает ввод с аппаратной клавиатуры после отключения, а onKey не вызывается — почему это происходAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 EditText по-прежнему получает ввод с аппаратной клавиатуры после отключения, а onKey не вызывается — почему это происход

Сообщение Anonymous »

Я работаю над приложением для Android, в котором динамически создаю EditText и хочу прекратить прием ввода после определенного условия (например, через 5 секунд).
Мои ожидания:
  • Как только 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 никогда не срабатывает
class MainActivity : AppCompatActivity() {

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»