Android - 获取键盘按键

时间:2012-06-30 10:06:32

标签: java android keyboard android-input-method key-events

我想抓住按键软键盘的任何键。我不想在我的Activity中使用EditView或TextView,必须从我的Activity中的扩展View处理该事件。

我刚试过这个:

1)覆盖onKeyUp(int keyCode, KeyEvent event)活动方法。这不适用于softkeybord它只是抓住几个硬键盘。

2)创建我的OnKeyListener并在我的视图中注册包含已注册且正在工作的OnTouchListener。这对软键不起作用。

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

4)使用InputMethodManager对象调用方法showSoftInput并将其传递给我的View。这对于抬起键盘既不起作用,实际上我必须调用toggleSoftInput;也没有抓住关键事件。

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

4 个答案:

答案 0 :(得分:37)

尝试在Activity

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

答案 1 :(得分:14)

通过 vasart 的提示,我可以获得KeyPress事件。为了使键码可打印,我使用函数 getUnicodeChar 将元素按钮状态传递给它,然后只是一个char cast来解决问题。

这是工作代码

@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字符。

答案 2 :(得分:1)

没有选项只能通过硬件键盘处理软键盘(屏幕键盘)上的按键事件。

了解更多详情:Handling Keyboard Actions

答案 3 :(得分:0)

在活动中打开键盘时,您的活动实际上变为前景... 所有TextArea或TextFields都有自己的机制来从onScreen键盘获取keypressed ... 如果你想使用onKeyDown()列表器用于虚拟键盘,请确保你在你的活动android:windowSoftInputMode =“stateAlwaysVisible”下的AndroidManifest文件中设置然后onkeyDown()将工作它确实对我有用...