I have an Activity that extends TextWatcher to detect changes in certain EditTexts, so it implements:
public void afterTextChanged(Editable s)
My question is: If there are several EditTexts with .addTextChangedListener(this) set, how can I differentiate which one changed given the Editable object in the afterTextChanged procedure?
Another option, with fewer anonymous inner classes, would be to simply inspect the currently focused View
. If your application for TextWatcher
hinges solely on changes made by the user while typing, then the changes will always occur in the View
that has current focus. Calling getCurrentFocus()
from anywhere inside of an Activity
or Window
will return the View
the user is focused on. From inside a TextWatcher
, this will almost assuredly be the specific EditText
instance.
SDK Docs Link
Hope that Helps!
There's one method to implement this without creating a TextWatcher
object for every EditText
, but I wouldn't use it:
protected void onCreate(Bundle savedInstanceState) {
// initialization...
EditText edit1 = findViewById(R.id.edit1);
edit1.addTextChangedListener(this);
EditText edit2 = findViewById(R.id.edit1);
edit2.addTextChangedListener(this);
}
private static CharSequence makeInitialString(EditText edit) {
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.setSpan(edit, 0, 0, Spanned.SPAN_MARK_MARK);
return builder;
}
public void afterTextChanged(Editable s) {
EditText[] edits = s.getSpans( 0, s.length(), EditText.class );
if (edits.length != 1) {
// this mustn't happen
}
// here's changed EditText
EditText edit = edits[0];
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With