Android:即使焦点在EditText

时间:2017-05-11 15:48:03

标签: android keyboard keyboard-events keyup

以下是有关Activity.onKeyUp()

的文档说明
  

当某个键被释放并且未被任何视图处理时调用   活动内部。因此,例如,按键同时按下光标   在TextView内部不会触发事件(除非它是一个   导航到另一个对象)因为TextView处理自己的键   印刷机。

但是,如果我覆盖活动的onKeyUp()并检查当焦点位于EditText时键入键时是否会触发,我可以看到onKeyUp()正在获取在以下情景中被解雇(在AVD上测试)。

  • 如果通过硬件键盘按下某个键。
  • 如果从虚拟键盘输入数字键(不为字符键触发事件)。

如果我正确理解了文档,onKeyUp()在上述情况下不应被解雇。

那么,文档是错误的,还是我误解了?

有没有其他方法可以捕获任何其他UI元素无法处理的键盘事件?

1 个答案:

答案 0 :(得分:0)

这似乎是一个错误,因为如果onKeyDown有焦点,则EditText不会被正确调用。但是,这确实意味着我们可以添加一个黑客来判断我们是否应该对onKeyUp事件作出反应。以下是我处理它的方式:

private val filteredEvents = HashMap<Long, KeyEvent>()

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
    filteredEvents.remove(event.downTime)?.let {
        Log.d("TAG", "Filtered event occurred. Handle it here.")
    }
    return super.onKeyUp(keyCode, event)
}

override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean =
        super.onKeyDown(keyCode, event.also { filteredEvents[it.downTime] = it })