Почему TextWatcher не работает в пользовательском Edittext в Android?

Я работаю над пользовательским текстом редактирования, но я немного застрял в одной вещи, я обнаружил, что TextWatcher не работает в пользовательском тексте редактирования.

public class InputValidation extends EditText {

public InputValidation(Context context) {
    super(context);
}

public InputValidation(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public InputValidation(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public void addTextChangedListener(android.text.TextWatcher watcher) {
    super.addTextChangedListener(new TextWatcherDelegator());
}

public class TextWatcherDelegator implements android.text.TextWatcher {

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        android.util.Log.d("TextWatcher", " beforeTextChanged :: " + charSequence.toString());
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(android.text.Editable editable) {
        android.util.Log.d("TextWatcher", " afterTextChanged :: " + editable.toString());
    }
  }
}

Макет XML

<com.example.inputvalidation.InputValidation
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:hint="Fullname"
    android:singleLine="true"
    android:textSize="20sp"/>

Над этим кодом вообще нет вызова состояний TextWatcher, пожалуйста, просмотрите мой код и предложите мне какое-нибудь решение.

1 ответ

Удалить это, это бесполезно:

@Override
public void addTextChangedListener(android.text.TextWatcher watcher) {
    super.addTextChangedListener(new TextWatcherDelegator());
}

Затем добавьте / удалите TextWatcher правильно, например, в onAttachedToWindow/onDetachedFromWindow методы:

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    addTextChangedListener(textWatcher);
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    removeTextChangedListener(textWatcher);
}

Также, textWatcher должен быть объектом, поэтому его можно создать из TextWatcherDelegator учебный класс:

TextWatcherDelegator textWatcher = new TextWatcherDelegator();

Или прямо из TextWatcher (что лучше, если нет другого использования для TextWatcherDelegator):

public TextWatcher textWatcher = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        android.util.Log.d("TextWatcher", " beforeTextChanged :: " + charSequence.toString());
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(android.text.Editable editable) {
        android.util.Log.d("TextWatcher", " afterTextChanged :: " + editable.toString());
    }
}
Другие вопросы по тегам