在HID模式下,我通过蓝牙将一个外部条形码扫描仪连接到我的平板电脑上,并试图处理我的应用程序中的输入。条形码扫描器基本上像键盘一样工作。
我有一个简单的gui,在我的主要活动中,我有以下方法:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
System.out.println(keyCode + " - " + (char) event.getUnicodeChar());
return true;
}
问题:
当我打开一个文本应用程序,像谷歌笔记和扫描任何代码条形码后插入一个新的行。这让我认为,我可以处理键事件,并将所有字符写入一个字符串生成器,直到我到达“Enter”的键事件为止。
但问题是,当我在应用程序中使用扫描仪(这个条形码)时,上面方法的输出如下:
59 -��<- 'Shift‘ 29-a 59 -�� 47-S 62 -8-1 9-2 10-3
在事件中无法捕捉到条形码末尾的“Enter”(应该是keyCode 66),但是我的GUI中的一个元素被高亮显示,这意味着扫描仪肯定发送了'Enter‘
当我在图形用户界面中添加一个多行EditText并在元素聚焦时扫描相同的条形码时,输出如下:
29-a 47-S 62 -8-1 9-2 10-3 66 -
在这里,“Enter”键事件被记录下来,而两个“Shift”键都是不可见的(但是EditText元素中的字母是大写的)。
作为一种解决办法,我可以有一个不可见的多行元素,它一直都是聚焦的,但我真的不喜欢依赖一个不可见的元素。相反,我想捕捉我的条形码扫描仪发送的所有关键笔画。
你知道为什么我看不到“进入”吗?
发布于 2015-07-26 08:35:31
我对这件事做了更多的研究,找到了一个很好(对我来说)令人满意的解决方案。
显然,onKeyDown和onKeyUp并不总是被调用的,特别是当一个KeyEvent被一个窗口元素所消耗时。在我的示例中,ListView具有默认焦点,并在到达上述方法之前使用ENTER事件(因此,正如我的问题描述中所提到的那样,它被突出显示)。
还可以使用另一种方法,即在将KeyEvents发送到窗口之前调用它。是dispatchKeyEvent。但是谨慎点,这个事件被称为两次,一次是按下键,一次是键向上。
这里有一个示例代码:
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
System.out.println(event.getAction() + " " + event.getKeyCode() + " - " + (char) event.getUnicodeChar());
return true;
}
这个解决方案对我有效,因为我的应用程序不需要监听任何其他关键事件,否则应该使用另一个返回。
https://stackoverflow.com/questions/31629853
复制相似问题