TextWatcher for more than one EditText TextWatcher for more than one EditText android android

TextWatcher for more than one EditText


Suggested solution in @Sebastian Roth's answer is not one instance of TextWatcher for some EditTexts. It is one class and n instances of that class for n EditTexts.

Each EditText has its own Spannable. TextWatcher's events has this Spannable as s parameter. I check their hashCode (unique Id of each object). myEditText1.getText() returns that Spannable. So if the myEditText1.getText().hashCode() equals with s.hashCode() it means that s belongs to myEditText1

So if you want to have one instance of TextWatcher for some EditTexts you should use this:

private TextWatcher generalTextWatcher = new TextWatcher() {        @Override    public void onTextChanged(CharSequence s, int start, int before,            int count) {        if (myEditText1.getText().hashCode() == s.hashCode())        {            myEditText1_onTextChanged(s, start, before, count);        }        else if (myEditText2.getText().hashCode() == s.hashCode())        {            myEditText2_onTextChanged(s, start, before, count);        }    }    @Override    public void beforeTextChanged(CharSequence s, int start, int count,            int after) {        if (myEditText1.getText().hashCode() == s.hashCode())        {            myEditText1_beforeTextChanged(s, start, count, after);        }        else if (myEditText2.getText().hashCode() == s.hashCode())        {            myEditText2_beforeTextChanged(s, start, count, after);        }    }    @Override    public void afterTextChanged(Editable s) {        if (myEditText1.getText().hashCode() == s.hashCode())        {            myEditText1_afterTextChanged(s);        }        else if (myEditText2.getText().hashCode() == s.hashCode())        {            myEditText2_afterTextChanged(s);        }    }};

and

myEditText1.addTextChangedListener(generalTextWatcher);myEditText2.addTextChangedListener(generalTextWatcher);


I would do it like this:

@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    EditText e = new EditText(this);    e.addTextChangedListener(new CustomTextWatcher(e));}private class CustomTextWatcher implements TextWatcher {    private EditText mEditText;    public CustomTextWatcher(EditText e) {         mEditText = e;    }    public void beforeTextChanged(CharSequence s, int start, int count, int after) {    }    public void onTextChanged(CharSequence s, int start, int before, int count) {    }    public void afterTextChanged(Editable s) {    }}


I use this solution:

  • Add method that returns listener:

    private TextWatcher getTextWatcher(final EditText editText) {    return new TextWatcher() {        @Override        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {        }        @Override        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {            // do what you want with your EditText            editText.setText("blabla");        }        @Override        public void afterTextChanged(Editable editable) {        }    };}
  • Add listener to multiple EditText's, you can also pass other parameters:

    editText1.addTextChangedListener(getTextWatcher(editText1));editText2.addTextChangedListener(getTextWatcher(editText2));editText3.addTextChangedListener(getTextWatcher(editText3));