我的问题是这样的;
我有一个编辑文本,正在使用 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/