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

时间:2015-07-25 18:37:42

标签: java android bluetooth barcode-scanner hid

我在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元素中的字母大写)。

作为一种解决方法,我可以拥有一个始终保持聚焦的不可见多线元素,但我真的不想依赖于一个不可见的元素。相反,我想抓住我的条形码扫描仪发送的所有击键。

为什么我看不到'回车'的任何想法?

1 个答案:

答案 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;
}

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