Android Studio 最佳实践:输入验证(Android)

mcdcgff0  于 2022-12-13  发布在  Android
关注(0)|答案(3)|浏览(254)

我是Android移动的开发的新手(Android Studio原生开发-获取新知识)。在这里,我想问一个关于输入验证最佳实践的问题。据我们所知,当开发人员开发输入表单时,我们需要防止用户在文本字段中键入错误的输入。因此,我的问题是:
1.我们可以创建一个java文件仅用于验证目的吗?所有的输入表单,必须去一个验证文件只(在一个应用程序中的许多输入页面屏幕的情况下)。如果,我如何才能获得一个例子/链接/教程的技术,为我的学习研究。如果,为什么?
从我个人的Angular 来看,它应该有一种方法来实现这种技术。这样我们就不需要为每个java文件重复使用相同的代码了(就干净的代码而言)。不幸的是,我没有找到任何例子或教程。也许我搜索了一个错误的关键字或误读。如果没有这样的技术存在,输入验证的最佳实践是什么?

  • 谢谢-谢谢
    p/s:这个帖子是为了找到一个更好的方法。谢谢。
5us2dqdw

5us2dqdw1#

这个java类实现了一个TextWatcher来“监视”编辑文本,监视对文本所做的任何更改:

public abstract class TextValidator implements TextWatcher {
    private final TextView textView;

    public TextValidator(TextView textView) {
        this.textView = textView;
    }

    public abstract void validate(TextView textView, String text);

    @Override
    final public void afterTextChanged(Editable s) {
        String text = textView.getText().toString();
        validate(textView, text);
    }

    @Override
    final public void 
    beforeTextChanged(CharSequence s, int start, int count, int after) {
         /* Needs to be implemented, but we are not using it. */ 
    }

    @Override
    final public void 
    onTextChanged(CharSequence s, int start, int before, int count) { 
         /* Needs to be implemented, but we are not using it. */    
    }
}

EditText中,可以将文本观察器设置为它的侦听器

editText.addTextChangedListener(new TextValidator(editText) {
    @Override public void validate(TextView textView, String text) {
       /* Insert your validation rules here */
    }
});
mum43rcc

mum43rcc2#

一种方法(我正在使用)是您应该有一个用于验证输入的助手,例如:
1.空
1.日期
1.密码
1.电子邮件
1.数值
1.及其他
下面是我ValidationHelper类中的一个示例:

public class InputValidatorHelper {
    public boolean isValidEmail(String string){
        final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
        Pattern pattern = Pattern.compile(EMAIL_PATTERN);
        Matcher matcher = pattern.matcher(string);
        return matcher.matches();
    }

    public boolean isValidPassword(String string, boolean allowSpecialChars){
        String PATTERN;
        if(allowSpecialChars){
            //PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})";
            PATTERN = "^[a-zA-Z@#$%]\\w{5,19}$";
        }else{
            //PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})";
            PATTERN = "^[a-zA-Z]\\w{5,19}$";
        }


        Pattern pattern = Pattern.compile(PATTERN);
        Matcher matcher = pattern.matcher(string);
        return matcher.matches();
    }

    public boolean isNullOrEmpty(String string){
        return TextUtils.isEmpty(string);
    }

    public boolean isNumeric(String string){
        return TextUtils.isDigitsOnly(string);
    }

    //Add more validators here if necessary
}

现在我使用这个类的方式是这样的:

InputValidatorHelper inputValidatorHelper = new InputValidatorHelper();
StringBuilder errMsg = new StringBuilder("Unable to save. Please fix the following errors and try again.\n");
//Validate and Save
boolean allowSave = true;
if (user.getEmail() == null && !inputValidatorHelper.isValidEmail(user_email)) {
    errMsg.append("- Invalid email address.\n");
    allowSave = false;
}

if (inputValidatorHelper.isNullOrEmpty(user_first_name)) {
    errMsg.append("- First name should not be empty.\n");
    allowSave = false;
}

if(allowSave){
    //Proceed with your save logic here
}

可以使用通过EditText#addTextChangedListener附加的TextWatcher调用验证
例如:

txtName.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        //Do nothing
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        validate();
    }
});
cbeh67ev

cbeh67ev3#

我认为为了以一种干净的方式处理它,每个视图都应该保持它们的验证逻辑和它们的有效状态。我们不应该在每个屏幕中使用相同的代码行。
例如:如果你有一个电话号码字段,你不应该在每一个屏幕上都写它验证逻辑。你可以为电话字段创建一个自定义视图,并将它的验证逻辑保存在自定义视图中。这样你就可以摆脱每个屏幕上的字段验证。但这还没有完成,你也可以在你的自定义按钮视图中处理有效状态。2这样你就可以从你的屏幕中消除重复的有效状态处理行。最后,您只需要一个逻辑来为按钮引入输入字段
我已经将所有这些逻辑提取为lib,并添加了简单的演示来说明其用法。
要使用它,只需在自定义输入视图中实现一个接口,在自定义按钮中实现另一个接口。
Demo.gif

用法
**对于输入字段:**您需要在输入字段中实现Validatable接口。此处将实现2个方法。在此示例中,我们的自定义输入视图扩展了AppCompatEditText

/**
 * Validity State of View
 * In here input field is valid if any text is entered
 * */
override val isValid: Boolean
    get() = length() > 0

/**
 * Informing Validator about change in input field
 * In here we are rechecking validity every time on after text change
 * */
override fun setupValidationListener(validator: Validator?) {
    addTextChangedListener(object : TextWatcher {
        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}

        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}

        /**
         * To inform Validator view is changed
         * */
        override fun afterTextChanged(p0: Editable?) {
            validator?.checkAll()
        }
    })
}

**对于“输出”视图(大多数情况下为按钮):**需要实现处理按钮的onValid状态的验证器接口。如果页面中的每个输入都有效,则将调用此方法。

/**
 *  Enabling button if validator informs that all inputs are valid
 */
override fun onValid(isValid: Boolean) {
    isEnabled = isValid
}

**绑定输入与输出视图:**您已将此行添加到Activity/片段中以进行验证绑定。第一个变量是验证器视图,然后您可以添加所有可验证视图,没有可验证视图限制

ValidationBinder.bind(bindind.btnContinue, bindind.inputFirst, bindind.inputSecond)

相关问题