以下是文档对Activity.onKeyUp()
在释放密钥且未由任何视图处理时调用 活动内部。因此,例如,在光标时按键 在文本视图中不会触发事件(除非它是 导航到另一个对象),因为 TextView 处理自己的键 印刷机。
但是,如果我覆盖活动的onKeyUp()
并检查它在焦点位于EditText
中时键入键时是否被触发,我可以看到onKeyUp()
在以下场景中被触发(在 AVD 上测试)。
- 如果通过硬件键盘按下某个键。
- 如果从虚拟键盘输入数字键(不会为字符键触发事件)。
如果我正确理解了文档,onKeyUp()
不应该在上述情况下被解雇。
那么,是文档错误,还是我误解了它?
还有其他方法可以捕获任何其他 UI 元素未处理的键盘事件吗?
这似乎确实是一个错误,因为如果EditText
有焦点,onKeyDown
就不会正确地调用它。然而,这确实意味着我们可以添加一个黑客来确定我们是否应该对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 })