2012-06-30 128 views
20

我想抓住按键的任何键的按下。我不想在我的活动中使用EditView或TextView,必须从我的活动中的扩展视图处理事件。Android - 获取键盘按键

我只是尝试这样做:

1)重写onKeyUp(int keyCode, KeyEvent event)活性的方法。这不适用于软键,它只是抓住几个硬键盘。

2)创建我的OnKeyListener并在我的视图中注册,其中包含已注册并正在运行的OnTouchListener。这对softkeyboar根本不起作用。 3)覆盖onKeyUp(int keyCode, KeyEvent event)查看方法。如果我设置了我的OnKeyListener,或者我没有设置它,这一切都无法工作。

4)与InputMethodManager对象调用方法showSoftInput并将其传递给我的View。这不起作用,因为我不得不打电话给toggleSoftInput;也不是为了赶上关键事件。

我测试了所有只在模拟器中,但我认为这就够了。为什么从键盘上采取一个简单的关键事件是如此复杂?在Activity

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

当你检查的源代码,像'EditText'和类'TextView',看他们如何处理它,你学到了什么? – CommonsWare

+5

研究源代码可以帮助但花费太多时间。 – Bemipefe

回答

31

试试我能得到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字符。

+0

它的工作!非常感谢vasart – Bemipefe

+0

但是,长按弹出窗口时所选字符存在问题。例如,如果我长按'a'并选择'à'getKeyCode和getUnicodeChar返回0 – Bemipefe

+0

查看'KeyEvent'类中的'getDeadChar()'方法 – vasart

13

使用dispatchKeyEvent(KeyEvent event)随着vasart的提示

+0

在我的情况下,自定义键盘视图没有响应dispatchkeyEvent ..我已经实现了keyboardView,我想要检测像ctrl + c,Ctrl + v这样的组合键。我该如何实现这一目标 – Roster

0

当键盘在活动开启您的活动实际上变成前景... 所有的TextArea或TextField的有自己的机制,以获得从屏幕键盘的keyPressed ... 如果你想使用的onkeydown()听者的虚拟键盘化妆确定你在AndroidManifest文件中设置了你的活动android:windowSoftInputMode =“stateAlwaysVisible”然后onkeyDown()会工作它确实为我工作...