1. 问题描述:
问题描述:EditView.addTextChangedListener死循环问题。
例如:我需要在EditView中输入数据的同时做出改变,如自动补全单位,这样的话我们会在输入数据之后,调用afterTextChanged
函数,但是当我们补全单位之后,我们又需要利用setText()
函数把我们带有单位的数据传递到EditView中去,这个时候会再次调用afterTextChanged
函数,这样就存在死循环问题。
mTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
}
};
edTime.addTextChangedListener(mTextWatcher);
2. 解决方案:
通过设置flag
表示标记,初始化的时候我们把它设置为false,然后在EditView中完成输入之后,会调用一次afterTextChanged
,这个时候会调用else中的部分,完成补全单位的操作,同时把flag
赋值为true,接下来由于setText()的操作,会再次调用afterTextChanged
,这个时候flag
的值为true,所以会返回,并把flag
的值赋值为false,等待下一次输入。
private void setListener(){
mTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
if (flag){
flag = false;
return;
}
else {
flag = true;
String regEx="[a-zA-Z]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(editable.toString().trim());
String temp = m.replaceAll("").trim();
if (temp.length()==0){
edTime.setText("");
}
else {
edTime.setText(temp+" "+unit);
}
}
}
};
edTime.addTextChangedListener(mTextWatcher);
}