EditText删除键未在第一个keydown上注册

时间:2011-05-11 16:47:48

标签: android android-edittext keylistener keydown

我的问题是这个;

我有一个编辑文本,我正在使用setKeyListener并创建一个新的NumberKeyListener。在keydown中,当一个数字被命中时,它按预期工作,但是当命中删除/退格按钮时,它不会在第一次X次尝试时注册,但是在X + 1上它将在其他地方注册,其中X是其他数字。钥匙我打了。例如,如果我输入5,然后是6,然后是7,我的edittext将读取567,如果我点击删除,没有任何反应,再次点击两次,仍然没有,在第4次点击时,它将最终删除7并且为56。这很奇怪,因为我在keydown回调中有一个日志声明,看起来它甚至没有在前3次按下时被触发?

任何建议都表示赞赏。

更新:我注意到如果我点击edittext并重新点击它,我的删除将在第一次点击时注册。是否存在某些与需要清除的edittexts关联的按键缓冲区?

 myedittext.setKeyListener(new NumberKeyListener() {        
       @Override
       public int getInputType() {
           return InputType.TYPE_CLASS_NUMBER;
       }

       @Override
       public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
           if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
               //logic here
           } else if (keyCode == KeyEvent.KEYCODE_DEL) {
               Log.i("DEBUG","delete key hit");
               //more logic here
           }
           Log.i("DEBUG","key was pressed");
           update();
           return true;
       }

       @Override
       protected char[] getAcceptedChars() {
           return new char[]{'0','1','2','3','4','5','6','7','8','9'};
       }
   });

使用上面的代码,我从keylistener中删除了所有逻辑和update()调用,只是日志打印,我看到了相同的行为,它似乎无法识别第一次按下删除。

2 个答案:

答案 0 :(得分:1)

请注意,无法保证接收键事件,包括KEYCODE_DEL,,除非覆盖视图中的onCreateInputConnection(),然后将TYPE_NULL作为InputType返回到调用IME。可以在这里找到一个例子:

Android - cannot capture backspace/delete press in soft. keyboard

然而 ,如果你要覆盖EditText,我会根本不使用关键事件,因为EditText已经通过提供一个直接支持你的目的来支持你的目的InputFilter工具:

myEditText.setFilters(new InputFilter[]{
  //Filter this so that it removes everything that is not a digit.
  new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start,
                               int end, Spanned dest, int dstart, int dend) {
      //This is filtering ONE character at a TIME, as the user types them.
      String sourceString = source.toString();
      String sourceStringDigits = sourceString.replaceAll("[^0123456789]", "");
      return sourceStringDigits;
    }
  }
};

上面应该过滤你的文本,而不会干扰由EditText本身处理的退格键(删除)处理。

答案 1 :(得分:0)

NumberKeyListener延伸BaseKeyListener

您是否尝试覆盖backspace()

http://developer.android.com/reference/android/text/method/BaseKeyListener.html#backspace%28android.view.View,%20android.text.Editable,%20int,%20android.view.KeyEvent%29

  

执行在TextView中按KEYCODE_DEL键时发生的操作。如果有选择,则删除选择;否则,删除光标前的字符,如果有的话; ALT + DEL删除光标所在行的所有内容。   返回

true if anything was deleted; false otherwise. 

请务必致电super.basckspace();以获得正确的行为。


我现在无法访问SDK来测试它,但是将其添加到您的Listener:

@Override
boolean backspace(View view, Editable content, int keyCode, KeyEvent event) {
    Log.d("NumberKeyListener","backspace() called");
    return super.backspace();
}

根据我对措辞和BaseKeyListener.java代码的理解,它是一个回调,当按下删除键时会响应。