2015-04-25 2 views
0
txt1.addTextChangedListener(new TextWatcher() { 

       public void onTextChanged(CharSequence s, int start, 
         int before, int count) { 

       } 

       public void beforeTextChanged(CharSequence s, int start, 
         int count, int after) { 
       } 

       public void afterTextChanged(Editable s) { 
        String value = txt1.getText().toString(); 
        txt1.setText(String.valueOf(Utilities 
          .roundOneDecimals(Double.parseDouble(value)))); 
       } 
     }); 

Если установленный текст agian в [afterTextChanged], программа снова вызовет событие.Как содержимое формата EditText в afterTextChanged?

Как содержимое формата EditText в afterTextChanged?

+5

Логическое флаг фиксирует рекурсию :) –

+0

@BojanKseneman Действительно действительно –

ответ

1

Как @Bojan Kseneman предложение, флаг boolean решить проблему.

boolean enableChangeListener = true; 

txt1.addTextChangedListener(new TextWatcher() { 

       public void onTextChanged(CharSequence s, int start, 
         int before, int count) { 

       } 

       public void beforeTextChanged(CharSequence s, int start, 
         int count, int after) { 
       } 

       public void afterTextChanged(Editable s) { 
        if(enableChangeListener){ 
         enableChangeListener = false; 
         String value = txt1.getText().toString(); 
         txt1.setText(String.valueOf(Utilities 
          .roundOneDecimals(Double.parseDouble(value)))); 
        } 

       } 
     }); 
0

Я использовал это в своих проектах, он работает так, как должен. Используйте его вот так editText.addTextChangesLisener(new MyTextWatcher(editText));

Однако, как я упоминал в своем комментарии, простой логический fflag исправит вашу проблему.

public class MyTextWatcher implements TextWatcher { 
     private final WeakReference<EditText> editTextWeakReference; 

     public MyTextWatcher(EditText editText) { 
      editTextWeakReference = new WeakReference<EditText>(editText); 
     } 

     @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 editable) { 
      EditText editText = editTextWeakReference.get(); 
      if (editText == null) return; 
      String s = editable.toString(); 
      editText.removeTextChangedListener(this); 
      // Do your formatting here  
      editText.setText(String.valueOf(Utilities 
         .roundOneDecimals(Double.parseDouble(s))));editText.setSelection(editText.getText().toString.length()); 
      editText.addTextChangedListener(this); 
     } 
    } 
+0

Это хорошая идея использовать WeakReferences для представления? –

+1

Коэффициенты - этот код работает без него и не течет, я его не тестировал. Я просто отменил его, просто чтобы убедиться, что он не протекает. Кроме того, представления содержат ссылку на контекст, который, случается, является активностью, если вы просачиваете представление, вы просачиваете свою активность ... это большая проблема, чем вы думаете. :) –

Смежные вопросы