onKeyListener不使用软键盘(Android)

onKeyListener不使用软键盘(Android),android,listener,onkeydown,Android,Listener,Onkeydown,我正在使用onKeyListener获取onKey事件。它可以与普通键盘配合使用。但它不适用于软键盘。我只能获得数字的关键事件,而不能获得字母。有什么解决办法吗?任何形式的帮助都将不胜感激 我认为OnKeyListener根本不会被软件键盘调用。这与软件键盘是输入法设备有关,输入法设备可能不是键盘。不过,它似乎让onKeyListener变得毫无用处,因为它只适用于带有硬件键盘的手机。最近,我通过在活动中的EditText字段上使用而不是OnKeyListener解决了这个问题。OnKeyLis

我正在使用onKeyListener获取onKey事件。它可以与普通键盘配合使用。但它不适用于软键盘。我只能获得数字的关键事件,而不能获得字母。有什么解决办法吗?任何形式的帮助都将不胜感激

我认为OnKeyListener根本不会被软件键盘调用。这与软件键盘是输入法设备有关,输入法设备可能不是键盘。不过,它似乎让onKeyListener变得毫无用处,因为它只适用于带有硬件键盘的手机。最近,我通过在活动中的EditText字段上使用而不是OnKeyListener解决了这个问题。

OnKeyListener通过软键盘在Android 1.5上工作得非常好

从Android 1.6开始,字符和数字键不会通过onKey事件传递,而DEL键会


令人沮丧的是,这似乎是特定于设备的。我可以确认这在Xoom和Acer A100上有效。但是,三星Galaxy Tab Plus仅为非字符按钮触发事件。(所有运行蜂巢的设备)

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

然后,这里是方法:

public void setKeyListenerForEnter(){


我不确定这是否是一个比处理输入法键盘本身更好的解决方案,但这是一个解决方案。

这可能很愚蠢,但Android目前就是这样工作的

文档中指出,按键事件将仅针对硬件按键而不是软件进行传播

实际上,不鼓励设备制造商通过按键侦听器传播软键盘事件,尽管这完全取决于制造商是否尊重这一点,或者是否真正平等对待软键盘和硬键盘

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

因此,这里唯一简单的选择是实现您自己的IME(软键盘),并自己处理击键

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

将TextWatcher与AutocompleteTextView或EditText一起使用时请小心。不要从TextWatcher事件中修改AutocompleteTextView/EditText内容中的文本,否则很可能会导致无限事件/侦听循环

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

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

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

如果你从软键盘上得到的是一些字符而不是其他字符,这听起来很奇怪。你能把你的监听器的代码发布到哪里吗?public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layou.login_screen);emailTxt=(EditText)findViewById(R.id.email);emailTxt.setOnKeyListener(新的OnKeyListener(){public boolean onKey(视图v,int-keyCode,KeyEvent事件){Log.i(“Key-Value”,String.valueOf(keyCode));});}我现在只是在读按键。你的代码在模拟器键盘上工作,而不是在软键盘上。对软键盘有什么线索吗?我尝试过使用TextWatcher,但我需要每个按键的KeyUp和KeyDown事件。TextWatcher只给我KeyDown事件。我认为不可能从软件按键上收听KeyUp和KeyDownboard.OnKeyListener适用于某些设备上的每个符号。在其他设备上,一些按钮起作用:BackSpace、Enter等。您能给我们一个如何使用此代码的示例吗?我现在尝试了,但似乎不起作用。公共类CanvasView扩展视图{public CanvasView(Context c){super(c);//启用键盘设置KeyListener(新键盘());setFocusable(true);setFocusableInTouchMode(true);}}}//启用键盘浏览视图
public class CanvasView extends View{
    public CanvasView(Context c){
        super(c);

        //enable keyboard
        setOnKeyListener(new KeyBoard());
        setFocusable(true);
        setFocusableInTouchMode(true);
    }
}