Android 在到达焦点视图之前处理关键事件

tag*_*mer 1 java android bluetooth hid barcode-scanner

我在 HID 模式下通过蓝牙将外部条码扫描仪连接到我的平板电脑,并尝试处理我的应用程序中的输入。条码扫描器基本上像键盘一样工作。

我有一个简单的 gui,在我的主要活动中,我有以下方法:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    System.out.println(keyCode + " - " + (char) event.getUnicodeChar());
    return true;
}
Run Code Online (Sandbox Code Playgroud)

问题:

当我打开一个文本应用程序,比如谷歌笔记并扫描任何代码时,条形码被插入,然后是一个新行。这让我觉得我可以处理关键事件并将所有字符写入字符串构建器,直到我到达“Enter”的关键事件。

但问题是,当我在我的应用程序中使用扫描仪(此条形码)时,上述方法的输出如下:

59 - ?? <- 'Shift'
29 -
59 - ??
47 - s
62 -
8 - 1
9 - 2
10 - 3

事件中无法捕获条形码末尾的“Enter”(应该是 keyCode 66),但我的 GUI 中的元素之一被突出显示,这意味着扫描仪必须发送“Enter”

当我将多行 EditText 添加到我的 GUI 并在元素聚焦时扫描相同的条形码时,输出如下:

29 - a
47 - s
62 -
8 - 1
9 - 2
10 - 3
66 -

这里记录了 'Enter' 键事件,而两个 'Shift' 键都不可见(但 EditText 元素中的字母是大写的)。

作为一种解决方法,我可以拥有一个始终保持聚焦的隐形多行元素,但我真的不希望依赖隐形元素。相反,我想捕捉我的条形码扫描仪发送的所有按键。

为什么我看不到“输入”的任何想法?

tag*_*mer 5

我对这个问题做了更多的研究,我找到了一个很好的(对我来说)令人满意的解决我的问题的方法。

显然 onKeyDown 和 onKeyUp 并不总是被调用,特别是如果一个 KeyEvent 在其他地方被 window 元素消耗。在我的例子中,ListView 具有默认焦点并在到达提到的方法之前消耗了 ENTER 事件(因此它在我的问题描述中被突出显示)。

还有另一种方法可以使用,它在 KeyEvents 被发送到窗口之前被调用。它是 dispatchKeyEvent。但谨慎起见,该事件被调用两次,一次是按下键,一次是按下键。

这里是一个示例代码:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {

    System.out.println(event.getAction() + " " + event.getKeyCode() + " - " + (char) event.getUnicodeChar());

    return true;
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案对我有用,因为我的应用程序不需要监听任何其他关键事件,否则应该使用另一个返回。