onKeyListener无法在虚拟键盘上工作

bob*_*tko 23 android onkeypress onkeydown virtual-keyboard

我不明白为什么这段代码不起作用.仅检测到退格键和返回键.监听器不会触发任何其他密钥.我的设备是Nexus One.

我试图覆盖活动的OnKeyDown方法,这更糟糕.唯一检测到的按钮是硬件后退按钮.

我看到有关使用TextWatcher和onTextChanged的建议,虽然这可能在某些情况下有用,但这不是真正的解决方法.例如,如果文本框为空,则不会检测用户是否按BackSpace(删除)按钮.那么任何想法?

        TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            makeToast(keyCode + " key pressed");
            return true;
        }
    });
Run Code Online (Sandbox Code Playgroud)

bob*_*tko 19

好.我终于想到了如何做我想做的事情,我并不为Android感到骄傲.

我正在编写服务器/客户端应用程序,在客户端我必须打开SoftKeyboard并发送按键(字符和DEL键)...每按一次键,该字符将被发送到服务器.如果按下DEL,我将序列{BS}发送到服务器.

为了做到这一点,我必须实现TextWatcher和onTextChange,除了EditText为空并且用户按DEL键的情况之外,它运行良好.由于EditText没有变化,因此无法检测到是否按下了DEL键.

除了TextWatcher之外,我还必须实现onKeyListener,它附加到我的EditText控件.此onKeyListener忽略除了DEL和RETURN之外的SoftKeyboard上的所有键.不知道为什么?可能有一个bug?

这是我的代码:

    TextView txtInput = (TextView)findViewById(R.id.txtInput);
    txtInput.addTextChangedListener(inputTextWatcher);

    txtInput.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.d(TAG, keyCode + " character(code) to send");
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

和TextWatcher ....

private TextWatcher inputTextWatcher = new TextWatcher() {
    public void afterTextChanged(Editable s) { }
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
        { }
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.d(TAG, s.charAt(count-1) + " character to send");;          
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 当没有字符并且用户按返回键时怎么办? (2认同)