EditText或者TextView会经常需要添加TextWatcher以对文字输入进行监听,
顾名思义,addTextChangedListener方法只是添加一个TextWatcher,
如果在onResume方法中执行addTextChangedListener方法,
当跳转到另外一个activity后再返回当前activity的时候,
会再次执行onResume中的addTextChangedListener方法,
此时EditText或者TextView就会重复添加TextWatcher,
当TextWatcher中有对结果进行界面操作的时候,
就会造成对结果的界面操作多次执行。
具体执行多少次,就看add了多少个TextWatcher。
为了避免重复添加TextWatcher,可以在add了TextWatcher之后,
再想办法在后续的地方移除掉添加的TextWatcher–removeTextChangedListener方法。
这里的办法是:
基于在onResume中添加了TextWatcher的,可以在Application中添加判断,
对是否已经添加过TextWatcher做一个标记,如果已经添加过TextWatcher,则不再添加,避免重复add。
工具类中自定义一个TextWatcher
public static TextWatcher getTextWatcher2(final Context context,
final EditText editText,final TextView tv,final ImageView view,final IMyListener listener){
TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
if (start == 0 && before == 0 && count > 1) {
listener.isTrue(true, s.toString());
}else {
listener.isTrue(false, null);
Drawable left = ContextCompat.getDrawable(context, R.drawable.scan_rectangle_orange);
left.setBounds(0, 0, left.getMinimumWidth(), left.getIntrinsicHeight());
//判断此字符串是否为空
if (TextUtils.isEmpty(s)) {
tv.setCompoundDrawables(left, null, null, null);
tv.setText(null);
}else {
tv.setCompoundDrawables(null, null, null, null);
tv.setText("确认");
}
//判断此字符串是否为空
if(TextUtils.isEmpty(s)){
//若为空,则隐藏"删除图标"
view.setVisibility(View.INVISIBLE);
}else{
//若不为空,则显示"删除图标"
view.setVisibility(View.VISIBLE);
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
//若已经获取焦点,则显示"删除图标"
view.setVisibility(View.VISIBLE);
}else {
//若失去焦点,则隐藏"删除图标"
view.setVisibility(View.INVISIBLE);
}
}
});
}
};
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
editText.setText("");
}
});
return textWatcher;
}
onResume方法中初始化TextWatcher和添加TextWatcher
initTextWatchers();//初始化TextWatcher
if (!mApplication.isAddTextWatcher) {//判断是否执行添加TextWatcher
setTextChangedListener();//添加TextWatcher
}
Application中的属性
public class MyApplication extends Application{
/** 判断EditText是否已经添加了TextWatcher */
public boolean isAddTextWatcher = false;
}
initTextWatchers方法中初始化TextWatcher
//mIListener是自定义的接口,可以实现一些自定义的具体实现,需要自己依据需求定义
mTW = TextWatcherUtil.getTextWatcher2(
getActivity(),mET, mTV,mIV,mIListener);
setTextChangedListener方法中添加TextWatcher
mET.addTextChangedListener(mTW);
mApplication.isAddTextWatcher = true;//添加过后,修改application中的判断标识
MainActivity在退出后,要更改application中的判断标识,以再次进入app时可以再次添加TextWatcher,如果不更改application中的判断标识,则application的后台进程没有完全关闭的情况下,下次再打开app则会只初始化TextWatcher(initTextWatchers方法),而不添加TextWatcher(setTextChangedListener方法)
@Override
protected void onDestroy() {
mApplication.isAddTextWatcher = false;//退出后,EditText需要重新添加TextWatcher
super.onDestroy();
}