繁体   English   中英

onKeyListener无法使用软键盘(Android)

[英]onKeyListener not working with soft keyboard (Android)

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

我完全不相信使用软件键盘调用OnKeyListener。 它与软件键盘是IME设备有关,IME设备可能是键盘以外的东西。 它似乎使onKeyListener几乎无用,因为它只适用于带有硬件键盘的手机。 我最近工作解决此问题,通过使用TextWatcher在我的活动上的EditText场,而不是使用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();

然后,这是方法:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM