我在HID模式下通过蓝牙将外部条码扫描器连接到平板电脑,并尝试在我的应用程序中处理输入。条形码扫描仪基本上像键盘一样工作。
我有一个简单的gui,在我的主要活动中我有以下方法:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
System.out.println(keyCode + " - " + (char) event.getUnicodeChar());
return true;
}
问题:
当我打开文本应用程序时,如谷歌笔记和扫描任何代码,条形码插入后跟一个新行。这让我觉得我可以处理关键事件并将所有字符写入字符串构建器,直到我到达'Enter'的关键事件。
但问题是,当我在我的应用中使用扫描仪(this barcode)时,上述方法的输出如下:
59 - < - 'Shift'
29 - a
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元素中的字母大写)。
作为一种解决方法,我可以拥有一个始终保持聚焦的不可见多线元素,但我真的不想依赖于一个不可见的元素。相反,我想抓住我的条形码扫描仪发送的所有击键。
为什么我看不到'回车'的任何想法?
答案 0 :(得分:3)
我对此事做了一些研究,我找到了一个很好的(对我而言)满意的解决方案。
显然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;
}
这个解决方案对我有用,因为我的应用程序不需要监听任何其他键事件,否则应该使用另一个返回。