Android - 获取键盘按键

Posted

技术标签:

【中文标题】Android - 获取键盘按键【英文标题】:Android - Get keyboard key press 【发布时间】:2012-07-01 15:52:27 【问题描述】:

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

我刚试过这个:

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

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

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

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

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

【问题讨论】:

当您检查EditTextTextView 等类的源代码时,看看它们是如何处理的,您学到了什么? 研究源代码会有所帮助,但是太费时间了。 【参考方案1】:

要处理硬件键和返回键,您可以在 Activity 中使用 dispatchKeyEvent(KeyEvent event)

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

UPD:很遗憾,您无法处理软键盘事件(请参阅Handle single key events),除非您开发自己的自定义键盘(点击链接了解如何使用Creating input method)。

【讨论】:

但是长按时出现的弹出窗口选择的字符有问题。例如,如果我长按“a”并选择“à”,getKeyCode 和 getUnicodeChar 返回 0 看看KeyEvent类中的getDeadChar()方法 好的,但这会产生带有给定口音的字符。问题是我不知道按下了什么键,因为函数 getKeyCode 和 getUnicodeChar 中返回 0。 很遗憾没有。由于上面发布的 return 0 的问题。当我按à或è等时,它就像我的功能一样打印0。但是我发现解决方案转换 getUnicodeChar() 返回的 int @vasart Dispatch Veent 没有调用 Keboard View 键,它仅在按下返回键/按下硬件键时调用。【参考方案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 字符。

【讨论】:

在我的情况下,自定义键盘视图没有响应 dispatchkeyEvent .. 我已经实现了 keyboardView,我想检测像 ctrl+c 、 Ctrl+v 这样的键组合。我怎样才能做到这一点【参考方案3】:

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

更多详情:Handling Keyboard Actions

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Android - 获取键盘按键的主要内容,如果未能解决你的问题,请参考以下文章

android 键盘按键监听

如何获取自己键盘上按键的键值(KeyCode)

Android 增加(键盘)按键

ANDROID的怎么添加长按键,我的机器没HOME,想长按键返回HOME,我看别的机子可以的。求助!!

Android App监听软键盘按键的三种方式

JS获取键盘码并判断按键