我的代码:
fractionNumEt.addTextChangedListener(new TextWatcher() {
boolean ignoreChange = false;
@Override
public void afterTextChanged(Editable s) {
if(!ignoreChange) {
String string = String.valueOf(s);
if (string.length() > 2) {
string = string.substring(0, string.length() - 1);
ignoreChange = true;
fractionNumEt.setText(string);
ignoreChange = false;
}
}
}
...
我试图将字符限制为长度2,但是想继续听。当我输入'1','2'时,它显示“12”,这很好。现在当我键入'3'时,它写“31”而不是“23”。 到底是怎么回事! 我也尝试过:
string = string.substring(1, string.length());
在这种情况下,它首次使用n然后没有任何改变。
答案 0 :(得分:2)
这种情况正在发生,因为在setText()
之后,EditText的光标返回到第一个位置。然后,在字符串的前面添加任何新的数字。
尝试更新您的代码,如下所示:
@Override
public void afterTextChanged(Editable s) {
if(!ignoreChange) {
String string = String.valueOf(s);
if (string.length() > 2) {
string = string.substring(0, string.length() - 1);
ignoreChange = true;
fractionNumEt.setText(string);
fractionNumEt.setSelection(fractionNumEt.getText().length());
ignoreChange = false;
}
}
}
只是一个建议
检查可修改的文档HERE
我认为您不需要将其转换为String。 afterTextChanged(Editable s)
收到Editable as参数。您可以直接更改它。不需要将其转换为String。
此外:您甚至不需要创建EditText.setText(),因为可编辑的任何更改都会自动传递给EditText(因为afterTextChanged
是由android调用的,所以给你机会在文本片刻之前更新文本,以便在EditText中有效地显示该文本。
也许,就像那样:
@Override
public void afterTextChanged(Editable s) {
if(!ignoreChange) {
if(s.length() > 2) {
s.delete(s.length() - 1,s.length());
}
}
}
使用可编辑播放一点,您会发现它更容易。