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

来源:互联网 发布:低频变压器设计软件 编辑:程序博客网 时间:2024/06/03 21:39

对于一般项目的业务层,注册页的输入框都密密麻麻,对输入文本的检验也千奇百怪,在应对多个文本框文本进行判断时,总是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。
Demo地址
0 0
原创粉丝点击