以下是文档中关于 Activity.onKeyUp()
Called when a key was released and not handled by any of the views inside of the activity. So, for example, key presses while the cursor is inside a TextView will not trigger the event (unless it is a navigation to another object) because TextView handles its own key presses.
但是,如果我重写一个 Activity 的 onKeyUp()
并检查当我在焦点位于 EditText
中键入键时它是否被触发,我可以看到onKeyUp()
在以下场景中被触发(在 AVD 上测试)。
- 如果通过硬件键盘按下某个键。
- 如果从虚拟键盘输入数字键(字符键不会触发事件)。
如果我对文档的理解正确,onKeyUp()
不应在上述情况下被触发。
那么,是文档有误,还是我理解错了?
有没有其他方法可以捕获未被任何其他 UI 元素处理的键盘事件?
最佳答案
这确实是一个错误,因为如果 EditText
具有焦点,则不会正确调用 onKeyDown
。然而,这确实意味着我们可以添加一个 hack 来确定我们是否应该对 onKeyUp
事件使用react。以下是我的处理方式:
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 })
关于Android:即使焦点在 EditText 上,也会触发 onKeyUp() 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43920199/