多个EditText和TextView的监听,改变View的状态

多个EditText和TextView的监听,改变View的状态

本着让应用更加的方便,好用,快速原则,比如想让登录页,注册页中的edittext中的值符合条件的话,做一定的变化。
当你想要做出改变的时候,第一先百度下,看网上有没有类似的轮子,省的自己重复创造了,正所谓站在成功人的肩膀上,才会走的更高更远。
以下就是从网上找到的,参考博客
https://blog.csdn.net/duguodong2588/article/details/52503890
现在的轮子基本上都有了,主要看自己是否可以加以改造成自己想要的效果。
这个轮子很好用,思路也很好,但没有满足我的需求,我要在特定的editText上加上匹配规则,如果匹配通过的话就改变状态。

话不多说,直接上图看效果

这里写图片描述

改造思路

在改造的过程中,我首先想到的是用map集合来把editText和正则表达式组合到一块,后来感觉这样太笨重,于是想到了一个view控件都有setTag和getTag方法来组合到一块。

使用

    //1.创建工具类对象 把要改变颜色的tv先传过去
    WorkSizeCheckUtil.TextChangeListener textChangeListener = new WorkSizeCheckUtil.TextChangeListener(mBtnLogin);
    //2.把所有要监听的edittext都添加进去
    mEtPassword.setTag(WorkSizeCheckUtil.leastNum(6));
    textChangeListener.addAllEditText(mEtMobile, mEtPassword);
    //可以设置,也可以不设置,看自己的实际需求
    //3.接口回调 在这里拿到boolean变量 根据isHasContent的值决定 tv 应该设置什么颜色
        WorkSizeCheckUtil.setChangeListener(new WorkSizeCheckUtil.IEditTextChangeListener() {
            @Override
            public void textChange(boolean isHasContent) {
                if (isHasContent) {
                    mBtnLogin.setBackgroundColor(Color.RED);
                } else {
                    mBtnLogin.setBackgroundColor(Color.BLUE);
                }
            }
        });

以下是我改造过的。

```
public class WorkSizeCheckUtil {

//常用的正则表达式,存放在这样,以满足登录,注册等页面的监听
public final static String LEAST_TWO = "^.{2,}$";
public final static String LEAST_SIX = "(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}";//字母+数字。最少6位的正则表达式

public static String leastNum(int number){
    return "^.{" + number + ",}$";//最少number位
}

//回调监听,来改变具体的样式
public interface IEditTextChangeListener{
    void textChange(boolean isHasContent);
}
//发布作品时候填写尺寸的监听器
static IEditTextChangeListener mChangeListener;
/**如果控件只是简单的开始和禁用的话,可以不用调这个监听*/
public static void setChangeListener(IEditTextChangeListener changeListener) {
    mChangeListener = changeListener;
}


/**
 * 检测输入框是否都输入了内容
 * 从而改变按钮的是否可点击
 * 以及输入框后面的X的可见性,X点击删除输入框的内容
 */
public static class TextChangeListener {
    /**可以改变任何view*/
    private View button;
    private TextView[] editTexts;//其中getTag来获取String 是正则表达式的匹配规则

    public TextChangeListener(View button){
        this.button=button;
    }
    public TextChangeListener addAllEditText(TextView... editTexts){
        this.editTexts=editTexts;
        initEditListener();
        return this;
    }

    private void initEditListener() {
        Log.i("TAG", "调用了遍历editext的方法");
        for (TextView editText:editTexts){
            editText.addTextChangedListener(new TextChange());//添加监听
        }
    }
    /**
     * edit输入的变化来改变按钮的是否点击
     */
    private class TextChange implements TextWatcher {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if (checkAllEdit()){
                button.setEnabled(true);
                if (mChangeListener != null) {
                    mChangeListener.textChange(true);
                }
                Log.i("TAG", "所有edittext有值了");
            }else {
                button.setEnabled(false);
                if (mChangeListener != null) {
                    mChangeListener.textChange(false);
                }
                Log.i("TAG", "有edittext没值了");
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {}
    }
    /**
     * 检查所有的edit是否输入了数据
     * @return
     */
    private boolean checkAllEdit() {
            for (TextView editText:editTexts){
                String editableStr = editText.getText().toString();
                String patternStr = (String) editText.getTag();
                if (!TextUtils.isEmpty(editableStr)){//不为空就继续
                    if (patternStr != null && !TextUtils.isEmpty(patternStr)){//规则不为空
                        Pattern p = Pattern.compile(patternStr);
                        Matcher m = p.matcher(editableStr);
                        //规则不为空就继续
                        if (!m.matches()) return false;//验证不通过就返回false
                    }
                }else {//为空就返回false
                    return false;
                }
            }
            return true;//如果都符合条件就返回true;
    }

}

}

```

特点:

  1. 可以监听所有的view的子类的状态以及样式变化。
  2. 可以用TextView和EditText来做做监听。
  3. 使用正则表达式来做规则,应对所有的规则变化。
  4. 使用方便,代码简单

做好这个功能需要了解的知识点

  1. 正则表达式
  2. TextView与EditText的关系,
  3. View的setTag和getTag
  4. 系统监听器的使用和自定义回调机制
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值