Android 如何在TextWatcher中只调用一次PostTextChanged()方法?
当用户在EditText中完全输入文本时,我只想在TextWatcher中调用一次PostTextChanged(Editable s)方法 当前,在输入每个字符后调用afterTextChanged方法。如何只调用一次CheckSession()方法 我试过: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
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。事实上,我还有别的想法。