Android:即使焦点在 EditText 上,也会触发 onKeyUp() 事件

标签 android keyboard keyboard-events keyup

以下是文档中关于 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/

相关文章:

linux - 奇怪的问题,键盘输入被 emacs 锁定了?

java - 模拟不同窗口中的键盘按下

html - 从 HTML 输入触发 iOS 深色键盘

android - ViewPagerIndicator 不改变颜色

android - 某些 androids 应用程序无法通过 fiddler 连接

java - Android_id 的长度(以字节为单位)是多少?

objective-c - 静音 Cocoa 错误提示音

javascript - 在文本区域中输入时禁用 javascript 功能

javascript - 在 KeyboardEvent 中,应使用哪个属性来确定按下哪个键?

java - setFlags 后工具栏与状态栏重叠