Подтвердить что ты не робот

Очистить текст EditText после добавления функции onTextChanged

Я добавляю слушателя в поле EditText, чтобы соответствующим образом форматировать число в валюте в режиме реального времени.

        loanText.addTextChangedListener(new TextWatcher() {
        private String current = "";
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(!s.toString().equals(current)){
               String cleanString = s.toString().replaceAll("[$,.]", "");

               double parsed = Double.parseDouble(cleanString);
               String formated = NumberFormat.getCurrencyInstance().format((parsed/100));

               current = formated;
               loanText.setText(formated);
               loanText.setSelection(formated.length());
            }
        }
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }
    });

Однако, когда я пытаюсь очистить поле EditView, мое приложение выйдет из строя. Кроме того, ключ backspace больше не функционирует.

4b9b3361

Ответ 1

Проблема заключается в том, что ваш TextWatcher видит, что вы очищаете текст и поэтому отправляет запрос методам обратного вызова (afterTextChanged, beforeTextChanged и т.д.).

Что я сделал - просто удалить TextWatcher, очистить текст и добавить TextWatcher обратно в EditText. Таким образом, ничто не слушает мои изменения EditText.

Вам, вероятно, придется удерживать экземпляр TextWatcher вместо того, чтобы вставлять его, как и вы. Таким образом, вам не нужно создавать каждый раз, когда вы хотите очистить EditText

  • loanText.removeTextChangedListener(yourTextWatcherObject);
  • loanText.setText("");
  • loanText.addTextChangedListener(yourTextWatcherObject);

Ответ 2

Попробуйте использовать  afterTextChanged вместо. У меня также было много проблем с другим.

Ответ 4

public class MainActivity extends Activity {
EditText et;
TextWatcher tw;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et=(EditText) findViewById(R.id.et);

     tw=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) {
            et.removeTextChangedListener(tw);
            et.setText(Math.random()+"");//add your logic here 
            et.addTextChangedListener(tw);
        }};
        et.addTextChangedListener(tw);
}   

}  Это простое решение.

Ответ 5

Вы можете проверить, является ли текст пустым в onTextChanged следующим образом и ничего не делать, если он пуст

s.toString().isEmpty()

public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(!s.toString().equals(current) && !s.toString().isEmpty()){
           String cleanString = s.toString().replaceAll("[$,.]", "");

           double parsed = Double.parseDouble(cleanString);
           String formated = NumberFormat.getCurrencyInstance().format((parsed/100));

           current = formated;
           loanText.setText(formated);
           loanText.setSelection(formated.length());
        }
    }