在开发中,对于一组输入信息需要进行校验判断,符合之后才可以进行下一步,如果某一个不符合要求,那么就会提示响应的错误信息,如果需要输入较多条信息,一个一个地进行判断会显得很麻烦,我们可以封装一个简单的校验器,把每个模型加入进行去执行判断,这样就可以省很多事情。并且使得代码更加优化,常见的使用场景:登陆注册,账户密码的修改,邮箱格式的校验等地方都可以使用这种校验模型。
首先是校验执行器ValidationExecutor,是一个抽象类,其中包含一个抽象的执行判断的方法doValidate(Context, String);
/**
* 校验执行器
*/
public abstract class ValidationExecutor {
public abstract boolean doValidate(Context context, String text);
}
接下来就是校验模型,ValidationModel, 主要包含一个校验执行器和EditText, 即每一个输入的EditText都有自己的校验条件,校验执行器可以对EditText进行校验。
/**
* 校验模型
*/
@SuppressWarnings("unused")
public class ValidationModel {
private EditText editText;
private ValidationExecutor validationExecutor;
public ValidationModel(){}
public ValidationModel(EditText editText, ValidationExecutor executor){
this.editText = editText;
this.validationExecutor = executor;
}
public ValidationModel setEditText(EditText editText){
this.editText = editText;
return this;
}
public ValidationModel setValidationExecutor(ValidationExecutor executor){
this.validationExecutor = executor;
return this;
}
public EditText getEditText() {
return editText;
}
public ValidationExecutor getValidationExecutor() {
return validationExecutor;
}
public boolean isEmpty(){
return editText == null || TextUtils.isEmpty(editText.getText());
}
}
最后,就是校验器EditTextValidator,这里包含了ArrayList<ValidationModel>, 一个按钮button, 上下文参数Context。显然,校验器的作用就是对一个或多个模型进行整体性的校验,只要某一个模型不符合要求,就可以弹出对应的错误提示信息。
/**
* editText校验器
*/
@SuppressWarnings("unused")
public class EditTextValidator {
private TextView button; //提交按钮
private List<ValidationModel> validationModels;
private Context context;
public EditTextValidator(Context context){
init(context, null);
}
public EditTextValidator(Context context, TextView button){
init(context, button);
}
private void init(Context context, TextView button){
this.context = context;
this.button = button;
this.validationModels = new ArrayList<>();
}
public EditTextValidator setButton(TextView button){
this.button = button;
return this;
}
public EditTextValidator add(ValidationModel validationModel){
validationModels.add(validationModel);
return this;
}
// 这一步则是根据需求进行判断 如果符合规则返回true 否则返回false
public boolean validate(){
for (ValidationModel validationModel : validationModels){
//如果没有校验器处理,那么直接返回
if (validationModel.getValidationExecutor() == null || validationModel.getEditText() == null){
return true;
}
// 如果某个校验不正确 立马返回错误
if (!validationModel.getValidationExecutor().doValidate(context, validationModel.getEditText().getText().toString())){
return false;
}
}
return true;
}
/**
* 设置button是否可操作
*/
private void setEnable(){
if (button == null) return;
for (ValidationModel validationModel : validationModels){
if (validationModel.isEmpty()){ //为空 则不可以点击
button.setEnabled(false); //禁用
button.setTextColor(0x7fffffff); //半透明颜色
}else{
if (!button.isEnabled()){
button.setEnabled(true); //启用
button.setTextColor(0xffffffff); //白色背景
}
}
}
}
// 这一步校验主要对EditText是否为空进行校验 为空则禁用button 否则启用
public EditTextValidator execute(){
for (ValidationModel validationModel : validationModels){
if (validationModel.getEditText() == null){
return this;
}
validationModel.getEditText().addTextChangedListener(new 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) {
setEnable();
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
setEnable();
return this;
}
public TextView getButton() {
return button;
}
}
例如,模拟一个登陆案例:
1. 用户名,只做简单的不为空判断;
2. 密码长度,限制必须大于等于6 且小于等于20。
public class UserNameValidation extends ValidationExecutor {
@Override
public boolean doValidate(Context context, String text) {
text = text.trim();
if (text == null || text.equals("")){
Toast.makeText(context, "用户名不能为空", Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
}
public class PasswordValidation extends ValidationExecutor {
@Override
public boolean doValidate(Context context, String text) {
text = text.trim();
if (text == null || text.equals("")){
Toast.makeText(context, "密码不能为空", Toast.LENGTH_SHORT).show();
return false;
}
if ((text.length()<6) || (text.length()>20)) {
Toast.makeText(context, "密码长度不正确!", Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
}
在MainActivity中使用如下:
public class MainActivity extends AppCompatActivity {
private TextView button;
private ClearEditText userEdt;
private ClearEditText passwordEdt;
private EditTextValidator editTextValidator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (TextView) findViewById(R.id.button);
userEdt = (ClearEditText) findViewById(R.id.user_name);
passwordEdt = (ClearEditText) findViewById(R.id.password);
editTextValidator = new EditTextValidator(this, button);
editTextValidator.add(new ValidationModel(userEdt, new UserNameValidation()))
.add(new ValidationModel(passwordEdt, new PasswordValidation())).execute();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (editTextValidator.validate()){
Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
}
}
});
}
}