2

我的问题是这个;

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

任何建议表示赞赏。

更新:我注意到如果我单击编辑文本并返回它,我的删除将在第一次单击时注册。是否有某种与需要清除的编辑文本相关的击键缓冲区或其他东西?

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

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

4

2 回答 2

1

Note that there is no guarantee of receiving key events, including KEYCODE_DEL, unless you override onCreateInputConnection() in your view, and then return TYPE_NULL to the invoking IME as your InputType. An example can be found here:

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

However, I would not use key events at all if you are overriding EditText, because EditText already directly supports your purposes by providing an InputFilter facility:

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

The above should filter your text without interfering with backspace key (delete) processing, which is handled by EditText itself.

于 2014-01-17T05:33:59.537 回答
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 来测试它,但将其添加到您的侦听器中:

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

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

于 2011-05-11T19:30:07.883 回答