当我尝试检查EditText
时,我有一个奇怪的错误(我希望文字是IBAN,如FR76 2894 2894 2894 289
),所以我这样做(覆盖我的编辑文本onTextChanged
):
// format with IBAN regex
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
editText.setText(editText.getText().toString().replaceAll(" ", "")
.toUpperCase().replaceAll("[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}", "$0 "));
}
我正在与两款不同的Android手机进行比较:华硕Zenfone和Honor 5C。
两种设备在键入的第一个字符上具有相同的bevahiour(仅当它是一个字母时才有效)。但是,当我输入第二个字母时(文本应该是FR
之后):
荣誉5C:(预期行为)
Asus Zenfone:(行为错误)
有什么想法吗? 谢谢你的帮助。
答案 0 :(得分:0)
正如您在the documentation中看到的那样,从setText
致电onTextChanged
似乎是一个坏主意:
在更改文本时调用此方法,以防任何子类 想知道。在文本中,lengthAfter字符开头 在开始时刚刚替换了长度为lengthBefore的旧文本。
尝试从此回调中更改文本是错误的。
您是否尝试在EditText
上使用TextWatcher?例如:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
// This is only a sample code trying to reproduce your current behavior.
// I did not test it.
String iban = s.toString().toUpperCase().replaceAll(" ", "");
String compactIban = iban.replaceAll("[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}", "$0 ");
s.replace(0, s.length(), compactIban);
}
});