首页 文章

onKeyListener无法在虚拟键盘上工作

提问于
浏览
21

我不明白为什么这段代码不起作用 . 仅检测到退格键和返回键 . 监听器不会触发任何其他密钥 . 我的设备是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;
        }
    });

5 回答

  • 2

    你这里犯了一个错误 .
    它应该 return true ,如果你处理了这个事件 . 如果你想 allow the event to be handled by the next receiverreturn false
    你总是回归真实

  • 0

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

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

    为了做到这一点,我必须实现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;
            }
        });
    

    和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");;          
        }
    };
    
  • 3

    注意:在edittext中提及输入类型 .

    <EditText android:id="@+id/select_category" 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textCapSentences|textAutoCorrect" >
    
    
    
    edittext.setOnEditorActionListener(new OnEditorActionListener() {
    
                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    
                    if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) {
                        //do something here.
                        return true;
                    }
                    return false;
                }
            });
    
  • 4

    您是否尝试过为该视图使用特定的侦听器子类?

    我有一个与EditText类似的问题 . 以下代码有效:

    private OnKeyListener keyListener = new EditText.OnKeyListener(){
    
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            EditText et = (EditText) v;
            Log.i("APPEVENT", "Key hit: "+ event);
            //...
            return false;
        }
    
    };
    

    但如果我使用 View.OnKeyListener ,我只记录退格并输入 . 它可能与 TextView 类似的问题 . 也许子类键侦听器对给定 View 子类的更多事件敏感 .

  • 18

    我们在iPhone上也遇到了TextWatcher问题 - 如果缓冲区为空,键盘不会发送del事件 . 我们通过预加载1000个字符的键盘缓冲区来解决它 . 幸运的是,我们的应用程序隐藏了键盘后面的编辑字段,因此看不到1000个字符 . 这很难看,但它有效(除非用户在输入任何数据之前连续点击1000次删除!)

相关问题