Android表单校验器,让你的文本校验清晰化

对于一般项目的业务层,注册页的输入框都密密麻麻,对输入文本的检验也千奇百怪,在应对多个文本框文本进行判断时,总是if、else不仅让我们的代码写的过长,而且有时又会造成逻辑混乱,这时我们移动端可以采用表单的模式把当前模块中的所有文本框放入一个表单校验器中,统一进行验证处理。LZ封装了一个表单验证器,支持Textview及其子类。


LZ定义了一个规则接口,所有子规则都实现了这个Rule,定义了两个通用方法

public interface Rule {

    boolean validate(String value);

    String getErrorMessage();
}
来看下具体实现类 ,最基本的非空判断,validate做校验处理,getErrorMessage获取错误信息

public class RequiredRule implements Rule {
    private String message;

    public RequiredRule(String message) {
        this.message = message;
    }

    @Override
    public boolean validate(String value) {
        return value != null && !value.isEmpty();
    }

    @Override
    public String getErrorMessage() {
        return message;
    }
}
封装的验证器,LZ把view和校验规则放在map里,value是Rule类型的数组,也就是说一个view可以对应多个规则,可以对操作的文本框进行多种类型的判断

public class Validator {

    public Map<TextView, List<Rule>> validations = new LinkedHashMap<TextView, List<Rule>>();

    public void register(TextView textView, Rule... rules) {
        validations.put(textView, Arrays.asList(rules));
    }

    public void unregister(TextView textView) {
        validations.remove(textView);
    }

    public void validateAll(ValidateResultCall resultCall) {
        boolean isTure = true;
        for (TextView key : validations.keySet()) {
            for (Rule rule : validations.get(key)) {
                if (!rule.validate(String.valueOf(key.getText()))) {
                    key.requestFocus();
                    resultCall.onFailure(key, rule.getErrorMessage());
                    isTure = false;
                    return;
                }
            }
        }
        if (isTure)
            resultCall.onSuccess();
    }

    public boolean validate(EditText editText) {
        List<Rule> rules = validations.get(editText);
        if (rules == null) {
            return true;
        } else {
            for (Rule rule : rules) {
                boolean validate = rule.validate(String.valueOf(editText.getText()));
                if (!validate) {
                    return false;
                }
            }
        }
        return true;
    }

}

我又封装了正则的base类

public class RegexRule implements Rule {
    private String regex;
    private String message;

    public RegexRule(String regex, String message) {
        this.regex = regex;
        this.message = message;
    }

    @Override
    public boolean validate(String value) {
        return Pattern.compile(regex).matcher(value).matches();
    }

    @Override
    public String getErrorMessage() {
        return message;
    }
}
用来做邮箱校验的RegexRule的子类

public class EmailRule extends RegexRule{

    public EmailRule(String message) {
        super("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", message);
    }
}

具体使用

在build.gradle中添加
compile 'com.yuhoon.validator:validator:v0.3'
实例validator
Validator validator = new Validator();
注册控件及验证规则
validator.register((EditText) findViewById(R.id.edt_password), new RequiredRule("密码不能为空"), new UniformityRule((EditText) findViewById(R.id.edt_rePassword), "两次密码输入不一致"));
validator.register((EditText) findViewById(R.id.edt_rePassword), new RequiredRule("密码不能为空"));

统一处理校验结果
validator.validateAll(new ValidateResultCall() {
    @Override
    public void onSuccess() {
        //TODO 成功
        Toast.makeText(MainActivity.this, "检验成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(TextView view,String message) {
        //TODO 失败
        view.setText(null);
        Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
    }
});
如果是单一控件也可以直接调用validate去做校验,返回值为boolean,true为验证通过
if (validator.validate((EditText) findViewById(R.id.edt_password))) {
    //TODO 成功
} else {
    //TODO 失败
}

定义的规则类

正则校验

  • EmailRule   邮箱校验

  • IdCardRule  身份证校验(15或18位)

  • PhoneNumberRule 电话校验

  • UrlRule URL校验

普通校验

  • ExactLengthRule 标准长度校验

  • MaxLengthRule   最大长度校验

  • MinLengthRule   最小长度校验

  • RequiredRule    非空校验

  • UniformityRule 与指定edittext进行文本校验

非校验

  • ConfirmationRule    确认提示信息

需要添加新规则的小伙伴,如果是普通规则实现Rule接口,如果是正则表达式,就继承RegexRule。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值