Очистить текст EditText после добавления реализации onTextChanged - PullRequest
13 голосов
/ 06 апреля 2011

Я добавляю слушателя в поле 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, мое приложение падает. Кроме того, клавиша возврата больше не работает.

Ответы [ 5 ]

19 голосов
/ 06 апреля 2011

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

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

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

  1. loanText.removeTextChangedListener(yourTextWatcherObject);
  2. loanText.setText("");
  3. loanText.addTextChangedListener(yourTextWatcherObject);
4 голосов
/ 06 апреля 2011

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

1 голос
/ 19 августа 2015
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);
}   

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

1 голос
/ 07 июня 2012

Я нашел этот класс, который отлично работает для меня: http://www.java2s.com/Code/Android/UI/ConvertinputvaluetoCurrencyinTextWatcher.htm

надеюсь, что вы, ребята, сэкономите время.

0 голосов
/ 19 августа 2015

Вы можете проверить, является ли текст пустым в 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());
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...