我的问题是这个;
我有一个编辑文本,我正在使用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()
调用,只是日志打印,我看到了相同的行为,它似乎无法识别第一次按下删除。
答案 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()
?
执行在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代码的理解,它是一个回调,当按下删除键时会响应。