onKeyListener无法使用软键盘(Android)

时间:2009-12-28 02:30:11

标签: android listener onkeydown

我正在使用onKeyListener来获取onKey事件。它可以正常使用普通键盘。但它不适用于软键盘。我只能获得数字而非字母的关键事件。有没有解决方法可以解决这个问题?任何形式的帮助将不胜感激。

6 个答案:

答案 0 :(得分:11)

我不相信使用软件键盘会调用OnKeyListener。它与软件键盘是IME设备有关,IME设备可能是键盘以外的东西。它似乎使onKeyListener几乎无用,因为它只适用于带有硬件键盘的手机。我最近通过在Activity中的EditText字段上使用TextWatcher而不是使用OnKeyListener解决了这个问题。

答案 1 :(得分:9)

onKeyListener通过软键盘在Android 1.5上完美运行

从Android 1.6开始,字符和数字键不通过onKey事件,但DEL键确实

令人沮丧的

答案 2 :(得分:4)

这可能是愚蠢的,但这就是Android目前的工作方式。

文档指出,关键事件只会传播硬件击键,而不是软件。

设备制造商实际上不鼓励通过关键的听众传播软键盘事件,尽管完全由制造商来尊重或者用相同的术语来实际处理软键盘和硬键盘。

从Android 4.2.2开始,Android系统本身根本不支持软键盘的关键加油事件,因此即使是制造商也无法选择自己的方式。

所以这里唯一的万无一失的选择是实现你自己的IME(软键盘),并自己处理击键。

TextWatcher主要用于替换键侦听器,但是editText.setText(...);还会触发TextWatcher事件,所以如果只对一个键入的键感兴趣,那么TextWatcher可能也不是解决方案。

将TextWatcher与AutocomleteTextView或EditText一起使用时请务必小心。不要在TextWatcher事件中修改AutocompleteTextView / EditText内容中的文本,否则你很可能最终会进入无限事件/监听循环。

希望这有助于澄清可用的选项,但遗憾的是它没有提供可行的解决方案。

令人失望的是,Google错过了用户界面的这一重要方面。

答案 3 :(得分:3)

这似乎是特定于设备的。我可以确认这适用于Xoom和Acer A100。但是,三星Galaxy Tab Plus仅针对非字符按钮触发事件。 (所有运行Honeycomb的设备)

答案 4 :(得分:1)

我通过将监听器放入其自己的方法并在第一次之后再次调用它来解决这个问题。在onCreate中我调用setKeyListenerForEnter();

然后,这是方法:

public void 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键盘本身更好,但它是一种解决方案。

答案 5 :(得分:-1)

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);
    }
}