Я получил два хороших ответа, но я просто хотел добавить это:
Причина, по которой я столкнулся с этой проблемой, заключалась в том, что editText.setText(...)
вызывался рекурсивно внутри afterTextChanged()
функция моего TextWatcher.Как справедливо заявили предыдущие авторы, решение состоит в том, чтобы временно остановить метод afterTextChanged()
от запуска таким образом:
boolean edit = true;
...
@Override
public void afterTextChanged(Editable editable){
if(edit){
edit = false;
editText.setText(String.format("%,d", Integer.parseInt(editText.getText().toString().trim())));
edit = true;
}
}
Таким образом, мы тщательно извилистые.Но это ставит НОВУЮ ПРОБЛЕМУ:
Используя эту стратегию, мы предполагаем, что строку в EditText можно легко перевести в int
.Когда мы введем больше чисел, приложение определенно завершится с ошибкой NumberFormatException из-за запятых.Поэтому важно, чтобы мы нашли способ решить эту проблему.Вот метод, который я написал, чтобы помочь мне:
public int getCommalessNumber(String commaNumber){
String newNumber = "";
String[] split = commaNumber.trim().split(",");
for(int i = 0; i < split.length; i++){
newNumber += split[i];
}
return newNumber;
}
Наконец, мы можем сделать это:
boolean edit = true;
...
@Override
public void afterTextChanged(Editable editable){
if(edit){
edit = false;
editText.setText(String.format("%,d", Integer.parseInt(getCommalessNumber(editText.getText().toString().trim()))));
edit = true;
}
}
Я надеюсь, что это поможет кому-то там.Веселое кодирование !!