安卓 - 获取键盘按键

我想抓住软键板的任何键的按下。我不想在我的活动中使用 EditView 或 TextView,必须从活动内的扩展视图中处理该事件。

我刚刚试过了这个:

1) 重写活动方法。这不适用于软键盘,它只是捕获了几个硬键盘。onKeyUp(int keyCode, KeyEvent event)

2)创建我的并在我的视图中注册,其中包含已注册和工作.这不适用于软键盘。OnKeyListenerOnTouchListener

3) 重写 View 方法。这根本不起作用,如果我设置了我的OnKeyListener,或者如果我不设置它。onKeyUp(int keyCode, KeyEvent event)

4)使用对象调用方法并将其传递给我的视图。这既不能提高键盘,也不起作用,确实我必须打电话;也不要捕捉关键事件。InputMethodManagershowSoftInputtoggleSoftInput

我只在模拟器中测试了所有内容,但我认为这已经足够了。为什么从键盘上取一个简单的键事件如此复杂?


答案 1

要处理硬件密钥和返回密钥,您可以在Activity

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    Log.i("key pressed", String.valueOf(event.getKeyCode()));
    return super.dispatchKeyEvent(event);
}

UPD:遗憾的是,您无法处理软键盘事件(请参阅处理单键事件),除非您开发自己的自定义键盘(点击链接了解如何创建输入法)。


答案 2

有了vasart的提示,我可以得到KeyPress事件。为了使键码可打印,我已经使用了函数getUnicodeChar向它传递元按钮状态,然后只需一个字符转换即可解决问题。

这是工作代码

@Override
public boolean dispatchKeyEvent(KeyEvent KEvent) 
{
    int keyaction = KEvent.getAction();

    if(keyaction == KeyEvent.ACTION_DOWN)
    {
        int keycode = KEvent.getKeyCode();
        int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState() );
        char character = (char) keyunicode;

        System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" +  keycode);
    }


    return super.dispatchKeyEvent(KEvent);
}

当然,这仅适用于 ASCII 字符。