【问题标题】:Android - Get keyboard key pressAndroid - 获取键盘按键
【发布时间】: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 等类的源代码时,看看它们是如何处理的,您学到了什么?
  • 研究源代码会有所帮助,但是太费时间了。

标签: java android keyboard keyevent android-input-method


【解决方案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() 将起作用,它确实对我有用...

    【讨论】:

      猜你喜欢
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多