我想抓住按键软键盘的任何键。我不想在我的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
;也没有抓住关键事件。
我只在模拟器中测试过,但我认为这已经足够了。为什么它如此复杂从键盘上取一个简单的键事件?
答案 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()将工作它确实对我有用...