Очистить текст 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 больше не функционирует.
Ответы
Ответ 1
Проблема заключается в том, что ваш TextWatcher
видит, что вы очищаете текст и поэтому отправляет запрос методам обратного вызова (afterTextChanged
, beforeTextChanged
и т.д.).
Что я сделал - просто удалить TextWatcher
, очистить текст и добавить TextWatcher
обратно в EditText
. Таким образом, ничто не слушает мои изменения EditText
.
Вам, вероятно, придется удерживать экземпляр TextWatcher
вместо того, чтобы вставлять его, как и вы. Таким образом, вам не нужно создавать каждый раз, когда вы хотите очистить EditText
-
loanText.removeTextChangedListener(yourTextWatcherObject);
-
loanText.setText("");
-
loanText.addTextChangedListener(yourTextWatcherObject);
Ответ 2
Попробуйте использовать afterTextChanged
вместо. У меня также было много проблем с другим.
Ответ 3
Я нашел этот класс, который отлично подходит для меня:
http://www.java2s.com/Code/Android/UI/ConvertinputvaluetoCurrencyinTextWatcher.htm
надеюсь, что вы сэкономите вас, ребята, некоторое время.
Ответ 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());
}
}