31

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

我刚试过这个:

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

2)创建我的OnKeyListener并在我的视图中注册它,其中包含一个已注册和正在工作的OnTouchListener. 这对软键盘根本不起作用。

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

4) 使用InputMethodManager对象调用方法showSoftInput并将其传递给我的视图。这对抬起键盘也不起作用,确实我必须打电话toggleSoftInput;也没有赶上关键事件。

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

4

4 回答 4

41

对于处理硬件键和返回键,您可以dispatchKeyEvent(KeyEvent event)在您的Activity

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

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

于 2012-06-30T18:52:53.090 回答
17

通过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 字符。

于 2012-07-05T16:50:50.737 回答
4

无法仅从硬件键盘处理软键盘(屏幕键盘)上的按键事件。

更多细节:处理键盘动作

注意:使用 KeyEvent 类和相关 API 处理键盘事件时,您应该期望此类键盘事件仅来自硬件键盘。您永远不应依赖接收软输入法(屏幕键盘)上任何键的键事件。

于 2017-02-20T14:00:51.837 回答
2

当在活动中打开键盘时,您的活动实际上变成了前台...所有 TextArea 或 TextFields 都有自己的机制来从 onScreen 键盘获得按键...如果您想使用 onKeyDown() 侦听器进行虚拟键盘,请确保您在 AndroidManifest 中设置您的活动 android:windowSoftInputMode="stateAlwaysVisible" 下的文件然后 onkeyDown() 将工作它确实对我有用...

于 2015-11-04T13:23:59.727 回答