Различное поведение регулярных выражений на разных устройствах
У меня странная ошибка, когда я пытаюсь проверить 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: Asus Zenfone и Honor 5C.
Оба устройства имеют одинаковый bevahiour на первом набранном символе (действует, только если это буква). Но тогда, когда я набираю вторую букву (текст должен быть FR
после этого):
Honor 5C: (ожидаемое поведение)
Asus Zenfone: (неправильное поведение)
Любая идея? Спасибо за вашу помощь.
1 ответ
Как видно из документации, звонить по телефону - плохая идея. setText
от onTextChanged
:
Этот метод вызывается при изменении текста, если какие-либо подклассы хотели бы знать. Внутри текста символы lengthAfter, начинающиеся с начала, только что заменили старый текст длиной lengthBefore.
Ошибка при попытке внести изменения в текст из этого обратного вызова.
Вы пробовали использовать TextWatcher на вашем EditText
? Например:
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);
}
});