onTextChanged не работает должным образом в пользовательском EditText

Мне нужно настроить текст редактирования, когда я ввожу текст, я отформатирую его при изменении текста. Я реализовал наблюдатель за текстом в тексте редактирования, ниже приведен код:

public class CustomEditText extends androidx.appcompat.widget.AppCompatEditText {

public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
  TextWatcher textChangeListener = new TextWatcher() {
        boolean isIgnoreChange = false;
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int position, int noToAdd, int 
        noToDelete) {

            CustomEditText.this.removeTextChangedListener(textChangeListener);
            CustomEditText.this.setText("personal"); // with some logic

             CustomEditText.this.addTextChangedListener(textChangeListener);                

        }

        @Override
        public void afterTextChanged(Editable editable) {
        }

    };
private void init() {
    this.addTextChangedListener(textChangeListener);
}


}

И я завернул свой EditText в TextInputLayout в макете.

Проблема: когда я удаляю TextChangedListener и вызываю метод setText, onTextChanged все еще вызывается еще раз. Я прикрепил исходный код Android onTextChanged и отладил код, я узнал, что TextInputLayout также подключен к списку слушателей, который я не добавил, и, возможно, это вызывает. Многократный вызов после удаления слушателя нарушает мою логику. Если кто-то получит какой-либо намек, который мне не хватает, пожалуйста, помогите.


person Qandil Tariq    schedule 22.11.2019    source источник
comment
переопределите метод TextWatcher, а затем добавьте к нему textwatcher. или реализовать Textwatcher и просто использовать addTextChangedListener(this)   -  person Atif AbbAsi    schedule 22.11.2019


Ответы (2)


Добавьте прослушиватель кликов EditText, как показано ниже, и выполните все эти методы в соответствии с вашими требованиями: -

onTextChanged,beforeTextChanged,afterTextChanged добавьте нужные действия в эти методы.

et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

    // TODO Auto-generated method stub
 }

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    // TODO Auto-generated method stub
 }

@Override
public void afterTextChanged(Editable s) {

    // TODO Auto-generated method stub
 }
});

Надеюсь, что это поможет вам.

person Twisha Kotecha    schedule 22.11.2019
comment
я не думаю, что здесь нам нужно использовать ed.addTextChangedListener, он уже editText, все, что нам нужно, это addTextChangedListener (это). - person Atif AbbAsi; 22.11.2019
comment
если это помогло, пожалуйста, подтвердите мой ответ. - person Twisha Kotecha; 27.11.2019

В методе init() вы должны добавить слушателя к CustomEditText:

public void init() {
    this.addTextChangedListener(textChangeListener);
}

И вы должны удалить приведенный ниже код в методе onTextChanged()

CustomEditText.this.removeTextChangedListener(textChangeListener);
CustomEditText.this.addTextChangedListener(textChangeListener);

Я рекомендую вам ознакомиться с этим руководством в 19:00.

person John Le    schedule 22.11.2019