我正在使用 onKeyListener 来获取 onKey 事件。它适用于普通键盘。但它不适用于软键盘。我只能获取数字而不是字母的 onKey 事件。有什么办法可以解决这个问题吗?任何形式的帮助将不胜感激。
6 回答
我不相信 OnKeyListener 会被软件键盘调用。它与作为 IME 设备的软件键盘和 IME 设备可能是键盘以外的东西有关。不过,它似乎使 onKeyListener 几乎毫无用处,因为它只适用于带有硬件键盘的手机。我最近通过在我的 Activity 中的 EditText 字段上使用 TextWatcher 而不是使用 OnKeyListener 来解决这个问题。
onKeyListener 通过软键盘在 Android 1.5 上完美运行
从 Android 1.6 开始,字符和数字键不再通过 onKey 事件,但 DEL 键可以
令人沮丧
这可能很愚蠢,但这就是 Android 目前的工作方式。
该文档指出,按键事件只会传播硬件击键,而不是软件。
实际上不鼓励设备制造商通过按键侦听器传播软键盘事件,尽管完全取决于制造商是否尊重这一点或实际上平等对待软键盘和硬键盘。
从 Android 4.2.2 开始,Android 系统本身将完全不支持软键盘的按键事件,因此即使是制造商也无法选择自己的方式。
所以这里唯一万无一失的选择是实现自己的 IME(软键盘),并自己处理击键。
TextWatcher 可以主要用于替换关键侦听器,但是 editText.setText(...); 也会触发 TextWatcher 事件,所以如果一个人只对键入的键感兴趣,那么可能 TextWatcher 也不是一个解决方案。
将 TextWatcher 与 AutocomleteTextView 或 EditText 一起使用时请小心。不要从 TextWatcher 事件中修改 AutocompleteTextView / EditText 内容中的文本,否则您很可能会陷入无限事件/侦听循环。
希望这有助于澄清可用的选项,但遗憾的是它没有提供有效的解决方案。
令人失望的是,谷歌错过了他们 UI 的这一重要方面。
这似乎是特定于设备的。我可以确认这适用于 Xoom 和 Acer A100。但是,三星 Galaxy Tab Plus 仅触发非字符按钮的事件。(所有运行 Honeycomb 的设备)
我通过将侦听器放入它自己的方法并在第一次之后再次调用它来解决这个问题。在 onCreate 我调用 setKeyListenerForEnter();
然后,方法如下:
公共无效 setKeyListenerForEnter(){
final EditText search_entry = (EditText) findViewById(R.id.search_entry);
search_entry.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
getSearchResults(v);
setKeyListenerForEnter();
return true;
}
return false;
}
});
}
我不确定这是否比处理 IME 键盘本身更好,但它是一个解决方案。
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view
setFocusable(true); //Enable hard keyboard to target view
例子:
public class CanvasView extends View{
public CanvasView(Context c){
super(c);
//enable keyboard
setOnKeyListener(new KeyBoard());
setFocusable(true);
setFocusableInTouchMode(true);
}
}