android-edittext-validation校验器

在Android开发中,为了优化代码和简化输入信息的校验过程,可以封装一个简单的ValidationExecutor校验器,它包含doValidate方法进行判断。每个EditText对应一个ValidationModel,包含校验器和EditText。例如,登录场景中,用户名需不为空,密码长度在6到20字符之间。这样的校验模型适用于登录注册、账户密码修改和邮箱格式验证等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发中,对于一组输入信息需要进行校验判断,符合之后才可以进行下一步,如果某一个不符合要求,那么就会提示响应的错误信息,如果需要输入较多条信息,一个一个地进行判断会显得很麻烦,我们可以封装一个简单的校验器,把每个模型加入进行去执行判断,这样就可以省很多事情。并且使得代码更加优化,常见的使用场景:登陆注册,账户密码的修改,邮箱格式的校验等地方都可以使用这种校验模型。


首先是校验执行器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;
    }
}


到这里,EditText校验器实现就差不多了,在使用的时候,只需要继承校验执行器ValidationExecutor并且实现其抽象方法doValidate(), 完成校验模型,添加到校验器中,就可以实现一些列的EditText输入信息进行校验了。


例如,模拟一个登陆案例:

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();
                }
            }
        });
    }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值