Search code examples
androidtextwatcher

add TextWatcher Listerner on focused view and remove it if not


I would have a OnFocusChangeListener Class that add TextWatcher Listener on EditText that have the focus and remove it when have not. I have made this but removeListener crash application (I'm not sure about the syntax... newbie here)

MyOnFocusChangeListener :

public class Listener_Water_EdText_OnClick extends Fragment_Eau implements View.OnFocusChangeListener {


@Override
public void onFocusChange(View v, boolean hasFocus) {

    if (v.getId() == R.id.et_wDebit && hasFocus) {
       et_wDebit.addTextChangedListener(new Listener_Water_EdText_TxtWatcher(et_wDebit));

    } else {
        et_wDebit.removeTextChangedListener(new Listener_Water_EdText_TxtWatcher(et_wDebit));
    }

    if (v.getId() == R.id.et_wPuissance && hasFocus) {
        et_wPuissance.addTextChangedListener(new Listener_Water_EdText_TxtWatcher(et_wPuissance));
    } else {
       et_wPuissance.removeTextChangedListener(new Listener_Water_EdText_TxtWatcher(et_wPuissance));
    }
  }
}

and just for information, My TextWatcherListener :

public class Listener_Water_EdText_TxtWatcher extends Fragment_Eau implements TextWatcher {

    private EditText et;

   public Listener_Water_EdText_TxtWatcher(EditText et) {
        this.et = et;
    }


    @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) {
        Log.i("afterTextChanged", s.toString());
        Log.i("Wcalc.PdcMax", WCalc.getPdCMaxToString());

        switch (et.getId()) {

            case R.id.et_wTetaAller:
                try {
                    WCalc.setTetaAller(Integer.valueOf(s.toString()));
                } catch (Exception e) {
                    WCalc.setTetaAller(0);
                }
                if (WCalc.getDebit() > 0) {
                    //Mise à jour de la puissance afin de relancer le calcul avec le nouveau dTeta
                    WCalc.setPuissance(WCalc.getPuissance());
                    et_wDebit.setText(WCalc.getDebitToString());
                    //Affichage des résultats du calcul
                    setResults();
                }
                break;

            case R.id.et_wTetaRetour:
                try {
                    WCalc.setTetaRetour(Integer.valueOf(s.toString()));
                } catch (Exception e) {
                    WCalc.setTetaRetour(0);
                }
                if (WCalc.getDebit() > 0) {
                    //Mise à jour de la puissance afin de relancer le calcul avec le nouveau dTeta
                    WCalc.setPuissance(WCalc.getPuissance());
                    et_wDebit.setText(WCalc.getDebitToString());
                    //Affichage des résultats du calcul
                    setResults();
                }
                break;

            case R.id.et_wPuissance:
                try {
                    WCalc.setPuissance(Float.valueOf(s.toString()));
                } catch (Exception e) {
                    WCalc.setPuissance(0);
                }
                et_wDebit.setText(WCalc.getDebitToString());
                //Affichage des résultats du calcul
                if (WCalc.getPuissance() > 0) {
                    setResults();
                } else {
                    setNA();
                }
                break;

            case R.id.et_wDebit:
                try {
                    WCalc.setDebit(Float.valueOf(s.toString()));
                } catch (Exception e) {
                    WCalc.setDebit(0);
                }
                et_wPuissance.setText(WCalc.getPuissanceToString());
                //Affichage des résultats du calcul
                if (WCalc.getDebit() > 0) {
                    setResults();
                } else {
                    setNA();
                }
                break;
        }

    }

Thanks in advance.


Solution

  • et_wDebit.removeTextChangedListener(new Listener_Water_EdText_TxtWatcher(et_wDebit));
    

    This line trys to remove a TxtWatcher that hasn't be added.

    public class Listener_Water_EdText_OnClick extends Fragment_Eau implements View.OnFocusChangeListener {
    
     public Listener_Water_EdText_TxtWatcher watcher0;
     public Listener_Water_EdText_TxtWatcher watcher1;
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
    
        if (v.getId() == R.id.et_wDebit && hasFocus) {
           watcher0 = new Listener_Water_EdText_TxtWatcher(et_wDebit);
           et_wDebit.addTextChangedListener();
        } else {
            if(watcher0!=null){
                try {
                    et_wDebit.removeTextChangedListener(watcher0);
                }catch (Throwable e){
                    Log.e("test","error",e);
                }
            }
        }
    
        if (v.getId() == R.id.et_wPuissance && hasFocus) {
            watcher1 =new Listener_Water_EdText_TxtWatcher(et_wPuissance);
            et_wPuissance.addTextChangedListener(watcher1);
        } else {
            if(watcher1!=null){
                try {
                    et_wPuissance.removeTextChangedListener(watcher1);
                }catch (Throwable e){
                    Log.e("test","error",e);
                }
            }
        }
      }
    }