2016-01-01 3 views
2

У меня есть 2 EditText + 2 TextWatcher, один EditText влияет на другой. Я борюсь с этим и понятия не имею, как избежать ошибки StackOverFlow,2 EditText + 2 TextWatcher - ошибка stackoverflow

Почему edit_stezenie_ldl.removeTextChangedListener (watch) недостаточно? Он должен остановить этот TextWatcher.

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    watch = 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) { 
      if(edit_stezenie_ldl.getText().toString().length()==0) { 
       edit_stezenie_ldl2.setText(null); 
      } 
      else { 

       String x = edit_stezenie_ldl.getText().toString(); 
       Double xy = Double.parseDouble(x)/(36.8); 
       Double rounded = round(xy, 2); 
       String wynik = rounded.toString(); 
       edit_stezenie_ldl2.setText(wynik); 

      } 
     } 
     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }; 
    watch2 = 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) { 
      if(edit_stezenie_ldl2.getText().toString().length()==0) { 
       edit_stezenie_ldl.setText(""); 
      } 
      else { 

       String x = edit_stezenie_ldl2.getText().toString(); 
       Double xy = Double.parseDouble(x)/(36.8); 
       Double rounded = round(xy, 2); 
       String wynik = rounded.toString(); 
       edit_stezenie_ldl.setText(wynik); 
      } 
     } 
     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }; 

    if(v==edit_stezenie_ldl && hasFocus){ 
      edit_stezenie_ldl2.removeTextChangedListener(watch2); 
      edit_stezenie_ldl.addTextChangedListener(watch); 
    } 
    else if(v==edit_stezenie_ldl2 && hasFocus){ 

      edit_stezenie_ldl.removeTextChangedListener(watch); 
      edit_stezenie_ldl2.addTextChangedListener(watch2); 

    } 
} 

ответ

1

removeTextChangedListener() не снимает TextWatcher, потому что это не то же самое watch объекта, как при добавлении слушателя, так как вы переопределить ваш TextWatcher каждый раз, когда onFocusChange() называются. Таким образом, ни один прослушиватель никогда не удаляется, и при каждом изменении фокуса вы добавляете нового слушателя, который все вызывает друг друга при изменении текста, заканчивая StackOverflowError.

Я предлагаю создать два объекта TextWatcher где-то за пределами onFocusChange(), чтобы они создавались только один раз.

Или же вы только экземпляр слушателя, когда они null:

if (watch == null) { 
    watch = new TextWatcher() { 
     ... 
    }; 
} 
if (watch2 == null) { 
    watch2 = new TextWatcher() { 
     ... 
    }; 
} 
+0

О мой бог :) Я пытался создать экземпляр TextWatcher где-то еще, но он не работает по какой-то странной причине, и теперь сделал это снова и отлично работает! Спасибо @ Floern! – klijakub

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