Android 如何在TextWatcher中只调用一次PostTextChanged()方法?

Android 如何在TextWatcher中只调用一次PostTextChanged()方法?,android,android-edittext,textwatcher,method-call,Android,Android Edittext,Textwatcher,Method Call,当用户在EditText中完全输入文本时,我只想在TextWatcher中调用一次PostTextChanged(Editable s)方法 当前,在输入每个字符后调用afterTextChanged方法。如何只调用一次CheckSession()方法 我试过: sentenceEdit.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(CharSequence s, int

当用户在EditText中完全输入文本时,我只想在TextWatcher中调用一次PostTextChanged(Editable s)方法

当前,在输入每个字符后调用afterTextChanged方法。如何只调用一次CheckSession()方法

我试过:

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());
            }
        });

键入一个字符后,删除textlistener

 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());
            }
        });

通过处理
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
            }


        });

希望这能奏效

我们不知道用户的进程何时结束。所以,您可以使用焦点更改侦听器

sentenceEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {
         checkSentence(sentenceEdit.getText().toString());
        }
    }
});
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) {}


}

简言之,你不能。回调方法并不是设计为只调用一次,因为@Mustafa Yanik指出,您永远不知道用户操作何时结束


您可以使用的另一种可能的方法是检测句子的结尾,例如当“.”或“?”或“!”时将添加到文本中,然后调用您的“check句子()”方法。

正如@Kalpesh Rupani所说的,尝试使用布尔值

尝试使用布尔值切换侦听器和自定义textlistener

sentenceEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {
         checkSentence(sentenceEdit.getText().toString());
        }
    }
});
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) {}


}
在onCreate方法中,附加侦听器:

editText.addTextChangedListener(new MyCustomTextWatcher(true));
创建自定义侦听器textwatcher作为内部类

在这里,您创建了一个自定义构造函数,它要求一个布尔变量。 对于您拥有的每个editText,如上所述附加侦听器,并向其传递“true”布尔值。 用户键入editText后,您将停用侦听器

sentenceEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus) {
         checkSentence(sentenceEdit.getText().toString());
        }
    }
});
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) {}


}

length.toString()在您的答案中是什么意思?很抱歉,如果(s.toString().length()>0){}///length是您的字符OK,但在删除侦听器时如何调用PostTextChanged()?删除TextListener后,您在何处添加或从何处需要该时间添加TextListener或共享您的完整逻辑将选中No so correct。它仍然多次调用我的方法。有时甚至不打电话。是的,我以前试过。但是当我们有3个连续的编辑文本时,问题就出现了。上次EditText的焦点何时丢失?您应该为其他EditText设置侦听器。我想,情况会是这样的;当用户的进程将结束时(例如,用户按钮单击),您将选中last edittext。事实上,我还有别的想法。