重新映射的Sip'n'Puff输入不像键盘输入那样起作用

时间:2015-04-01 19:42:28

标签: android android-layout keyboard accessibility joystick

我正在尝试使用Sip'n'Puff设备与Android平板电脑配合使用。我将S& P设置为操纵杆模式。我通过在我的活动中覆盖dispatchKeyEvent将相关的操纵杆按钮重新映射到向下箭头键和回车键,如下:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BUTTON_1) {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            return dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN));
        } else if(event.getAction() == KeyEvent.ACTION_UP) {
            return dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN));
        }
    } else if(event.getKeyCode() == KeyEvent.KEYCODE_BUTTON_2) {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            return dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
        } else if(event.getAction() == KeyEvent.ACTION_UP) {
            return dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER));
        }
    }
    return super.dispatchKeyEvent(event);
}

现在问题就在这里。我已经设置了布局,以便用户可以通过按向下箭头键访问循环中的每个视图。使用物理键盘可以正常工作。我甚至将键盘上的Tab键重新映射到向下箭头, 正常工作。

然而,对于S& P设备,映射到向下箭头的键表现出奇怪的行为。如果我在ListView中导航,则选择将停在最后一项,焦点将不会移动到界面中的下一个视图。我已经确认正在捕获KEYCODE_BUTTON_1事件并将其转换为DPAD_DOWN,它只是没有做它应该做的事情。

鉴于重新映射键盘上的Tab键工作正常,可能是当插入操纵杆时,向下箭头键只是做了一些不同的事情?关于这里发生了什么的想法,以及我如何解决它?

编辑:我现在尝试使用输入和空格键的S& P设备的键盘模式。我将空间重新映射到向下箭头,并遇到与上面完全相同的问题。所以它似乎不是键盘与操纵杆问题。

修改编辑:在对postDelayed进行一些修改后,看起来调度向下箭头事件实际上并不会导致导航。或者更确切地说,它只会导致在ListView 进行导航。我想重新映射tab键是有效的,因为它不是在ListView中被视为制表符,而在ListView中则是向下箭头。至少它是一个领先者?

另一个编辑:我认为这里发生的事情是通过物理输入设备的导航是在Activity之外处理的。我可以在ListView中导航,因为它是Activity中的View,因此它从dispatchKeyEvent接收DPAD_DOWN事件并通过移动选择来做出反应。但是,它通常不是处理导航的视图:它是输入设备和应用程序之间OS中的某个层。所以问题现在变成了如何抓住那个导航层并覆盖那里的键映射。

0 个答案:

没有答案