Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最佳实践:输入验证(Android)_Java_Android_Validation_Android Studio - Fatal编程技术网

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

Java 最佳实践:输入验证(Android),java,android,validation,android-studio,Java,Android,Validation,Android Studio,我不熟悉android移动开发(android Studio原生开发-获取新知识)。这里我想问一个关于输入验证最佳实践的问题。 据我们所知,当开发人员开发输入表单时。我们需要防止用户在文本字段中输入错误的内容。我的问题是 我们能否创建一个仅用于验证目的的java文件?所有输入表单,必须仅转到该验证文件(如果一个应用程序中有多个输入页面屏幕)。如果是,我如何获得该技术的示例/链接/教程,用于我的学习研究。如果否,为什么 从我个人的观点来看,它应该有一种实现技术的方法。因此,我们不需要为每个java

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

  • 我们能否创建一个仅用于验证目的的java文件?所有输入表单,必须仅转到该验证文件(如果一个应用程序中有多个输入页面屏幕)。如果,我如何获得该技术的示例/链接/教程,用于我的学习研究。如果,为什么
  • 从我个人的观点来看,它应该有一种实现技术的方法。因此,我们不需要为每个java文件重复使用相同的代码(就干净的代码而言)。不幸的是,我没有找到任何例子或教程。也许我搜索了一个错误的关键字或误读了。如果不存在这样的技术,输入验证的最佳实践是什么

    多谢各位


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

    这个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 */
        }
    });
    
    一种方法(我正在使用)是您应该有一个助手来验证输入,例如:

  • 无效(或空)
  • 日期
  • 密码
  • 电子邮件
  • 数值
  • 及其他
  • 下面是我的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
    }
    
    您可以使用
    TextWatcher
    调用验证,该程序通过
    EditText\addTextChangedListener

    例如:

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

    实际上已经有了一些lib,并且对于您列出的所有TextView类型都有Android专用的输入类型。为什么需要验证?将UI组件的实例传递给只处理逻辑的类是一种好模式吗?我认为更好的方法是从validator类获得validate响应,并在实现类中使用该值来操作UI。