控件避免重复addTextChangedListener(mTextWatcher)的问题

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();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值