【问题标题】:Best Practice: Input Validation (Android)最佳实践:输入验证 (Android)
【发布时间】:2016-01-09 10:15:10
【问题描述】:

我是 android 移动开发新手(Android Studio 原生开发 - 新知识)。在这里,我想问一个关于输入验证最佳实践的问题。 据我们所知,当开发人员开发输入表单时。我们需要防止用户在文本字段中输入错误的内容。所以这是我的问题,

  1. 我们可以创建一个仅用于验证目的的 java 文件吗?所有输入表单,必须仅转到该一个验证文件(如果一个应用程序中有多个输入页面屏幕)。如果,我怎样才能获得该技术的示例/链接/教程用于我的学习研究。如果,为什么?

从我个人的角度来看,它应该有一种方法来实现该技术。这样我们就不需要为每个 java 文件重新重用相同的代码(就干净代码而言)。不幸的是,我没有找到任何示例或教程。也许我搜索了错误的关键字或误读。如果不存在这样的技术,那么输入验证的最佳实践是什么?

谢谢。

p/s:此线程用于在最佳实践中找到更好的方法。谢谢。

【问题讨论】:

标签: java android validation android-studio


【解决方案1】:

这个 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 */
    }
});

【讨论】:

  • 将 UI 组件的实例传递给应该只处理逻辑的类是否是一种好的模式?我认为更好的方法是从验证器类获取验证响应,并在实现类中使用该值来操作 UI。
【解决方案2】:

一种方法(我正在使用)是您应该有一个帮助器来验证输入,例如:

  1. 空虚(或空虚)
  2. 日期
  3. 密码
  4. 电子邮件
  5. 数值
  6. 及其他

这是我的 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();
    }
});

【讨论】:

  • 您列出的所有 TextView 类型都有 Android 特殊 InputTypes。为什么需要验证?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2014-04-19
  • 2020-07-07
  • 2011-09-24
  • 1970-01-01
相关资源
最近更新 更多