对于一般项目的业务层,注册页的输入框都密密麻麻,对输入文本的检验也千奇百怪,在应对多个文本框文本进行判断时,总是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 确认提示信息