android - EditText 删除键未在第一次按下时注册

标签 android android-edittext keylistener keydown

我的问题是这样的;

我有一个编辑文本,正在使用 setKeyListener 并创建一个新的 NumberKeyListener。在此 on keydown 当一个数字被击中时它按预期工作,但是当删除/退格按钮被击中时,它不会在前 X 次尝试中注册,但在 X + 1 上它会注册,其中 X 是数字,其他我打过的 key 。例如,如果我输入 5,然后 6,然后 7,我的 edittext 将读取 567,如果我点击删除,没有任何反应,再点击两次,仍然没有,在第四次点击时,它最终会删除 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'};
       }
   });

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

最佳答案

请注意,不能保证接收到键事件,包括 KEYCODE_DEL,除非您在 View 中覆盖 onCreateInputConnection(),然后将 TYPE_NULL 作为您的 InputType 返回到调用 IME。可以在此处找到示例:

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

但是,如果您重写 EditText,我根本不会使用按键事件,因为 EditText 已经通过提供一个输入过滤器工具:

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 本身处理的退格键(删除)处理的情况下过滤您的文本。

关于android - EditText 删除键未在第一次按下时注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5967784/

相关文章:

java - 当按下某些其他键时,KeyEvent 不会触发

android - 与同级 fragment 相比,BottomSheetDialog 中的 SwitchCompat 主题颜色错误

android - 带有 edittext 和 textwatcher 的 ListView 。 Textwatcher 触发多次(超过 3 次)

java - Android:EditText 返回与内容相同的值

java - 为什么没有检测到 key ?

Java:Pacman 不会根据 keyTyped 移动

java - 找不到符号方法 setRadioPower()

android - Eclipse 和 Android SDK(模拟器)在 Windows 或 Mac 机器上更快吗?

android - 通过 btn 单击启动 Android 默认电子邮件应用程序

Android - 在 EditText 中使用与浏览器地址栏相同的键盘