Как вызвать метод afterTextChanged() в TextWatcher только один раз?

Я хочу вызвать метод afterTextChanged(Editable s) в TextWatcher только один раз, когда пользователь полностью ввел текст в EditText.

В настоящее время метод afterTextChanged вызывается после ввода каждого символа. Как сделать вызов моего метода checkSentence() только один раз?

Я пробовал как:

sentenceEdit.addTextChangedListener(new TextWatcher() {
            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) {
                isSentenceModified=true;
                //Toast.makeText(MainActivity.this,"Editable:"+s,Toast.LENGTH_SHORT).show();
                checkSentence(s.toString());
            }
        });

person Coder boy    schedule 29.01.2020    source источник


Ответы (5)


Попробуйте это, обработав переменную boolean

edtText.addTextChangedListener(new TextWatcher() 
        {
            boolean isReflect = false;
            public void beforeTextChanged(CharSequence cs, int start, int count, int after) {}
            public void onTextChanged(CharSequence cs, int start, int before, int count) {}
            public void afterTextChanged(Editable editable) 
            {
                if (isReflect) 
                { 
                    // your code here
                }
                isReflect = !isReflect; //Here boolean value is changed after if loop
            }


        });

Надеюсь, это сработает!

person Kalpesh Rupani    schedule 29.01.2020
comment
Нет так правильно. Тем не менее он вызывает мой метод несколько раз. Иногда даже не звонит. - person Coder boy; 29.01.2020

после ввода одного символа удалите свой текстовый прослушиватель

 sentenceEdit.addTextChangedListener(new TextWatcher() {
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }
            public void onTextChanged(CharSequence s, int start, int before, int count){
 if (s.toString().length() > 0) {
                        sentenceEdit.removeTextChangedListener(this);
                    } 
            }

            public void afterTextChanged(Editable s) {
                isSentenceModified=true;
                //Toast.makeText(MainActivity.this,"Editable:"+s,Toast.LENGTH_SHORT).show();
                checkSentence(s.toString());
            }
        });
person ThavaSelvan    schedule 29.01.2020
comment
Что означает length.toString() в вашем ответе? - person Coder boy; 29.01.2020
comment
извините за это if (s.toString().length() › 0) {} ///длина вашего символа - person ThavaSelvan; 29.01.2020
comment
Хорошо, но как вызвать afterTextChanged(), когда слушатель был удален? - person Coder boy; 29.01.2020
comment
после удаления textlisterner, где вы добавляете или из какого условия вам нужно это время addtextlistener - person ThavaSelvan; 29.01.2020
comment
или поделись полной логикой проверю - person ThavaSelvan; 29.01.2020

Мы не знаем, когда завершится процесс пользователя. Таким образом, вы можете использовать прослушиватель изменения фокуса.

sentenceEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {
         checkSentence(sentenceEdit.getText().toString());
        }
    }
});
person Mustafa Yanık    schedule 29.01.2020
comment
Да, я пробовал это раньше. но проблема возникает, когда у нас есть 3 последовательных EditTexts. когда будет потерян фокус для последнего EditText? - person Coder boy; 29.01.2020
comment
Вы должны установить прослушиватель для других текстов редактирования. Я думаю, сценарий будет таким; вы проверяете последний текст редактирования, пока процесс пользователя завершится (например, нажатие кнопки пользователя). На самом деле, у меня другая идея. - person Mustafa Yanık; 29.01.2020

Короче говоря, вы не можете. Метод обратного вызова не предназначен для однократного вызова, поскольку, как указал @Mustafa Yanik, вы никогда не знаете, когда закончится действие пользователя.

Другой возможный подход, который вы можете использовать, - это определить конец предложения, например, когда '.' или '?' или '!' добавляется к тексту, а затем вызывается метод checkSentence().

person Rahul Shukla    schedule 29.01.2020

Как сказал @Kalpesh Rupani, попробуйте с логическим значением.

Попробуйте это с логическим значением для переключения прослушивателя и пользовательского текстового прослушивателя.

В методе onCreate подключите прослушиватель:

editText.addTextChangedListener(new MyCustomTextWatcher(true));

Создайте собственный текстовый наблюдатель слушателя в качестве внутреннего класса.

Здесь вы создаете собственный конструктор, который запрашивает логическую переменную. Для каждого имеющегося у вас editText прикрепите прослушиватель, как указано выше, и передайте ему «истинное» логическое значение. Как только пользователь вводит editText, вы деактивируете прослушиватель.

class MyCustomTextWatcher implements TextWatcher { 

    Boolean isActivated;

    public MyCustomTextWatcher(boolean isActivated){
        this.isActivated = isActivated;

    }

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

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if (isActivated) {

             // Place your code here

          }

         isActivated = false
    }

    @Override
    public void afterTextChanged(Editable s) {}


}
person Tork    schedule 16.05.2020