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
;也没有赶上关键事件。
我只在模拟器中测试了所有内容,但我认为这已经足够了。为什么从键盘获取一个简单的按键事件如此复杂?
【问题讨论】:
当您检查EditText
和TextView
等类的源代码时,看看它们是如何处理的,您学到了什么?
研究源代码会有所帮助,但是太费时间了。
【参考方案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 - 获取键盘按键的主要内容,如果未能解决你的问题,请参考以下文章