Android:表单验证库

Android:表单验证库,android,android-layout,validation,Android,Android Layout,Validation,我试图在android中找到一个表单验证库。有这样的事吗 我有一个注册表,我想验证它的字段。如果用户输入了无效数据,我想在字段的右侧加一个红色警告标记,并弹出一个工具提示,说明他输入了无效数据 我知道android:inputType,但这不是我想要的我不知道任何这样的库。但是,如果您使用的是EditText,那么最好的选择是使用自定义: 然后你可以在你所有的编辑文本上使用它,比如 EditText editor = (EditText) findViewById(...your id...);

我试图在android中找到一个表单验证库。有这样的事吗

我有一个注册表,我想验证它的字段。如果用户输入了无效数据,我想在字段的右侧加一个红色警告标记,并弹出一个工具提示,说明他输入了无效数据


我知道android:inputType,但这不是我想要的

我不知道任何这样的库。但是,如果您使用的是EditText,那么最好的选择是使用自定义:

然后你可以在你所有的编辑文本上使用它,比如

EditText editor = (EditText) findViewById(...your id...);
editor.addTextChangedListener(new TextCheck(editor));

我也做了类似的事情。您可以改进此代码并根据需要进行调整

EditTextWithValidation.java

public class EditTextWithValidation extends EditText implements OnTouchListener {
    private EditTextValidator mValidator;

    public EditTextWithValidation(Context context) {
        super(context);

        initialize();
    }

    public EditTextWithValidation(Context context, AttributeSet attrs) {
        super(context, attrs);

        initialize();
    }

    public EditTextWithValidation(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        initialize();
    }

    public EditTextValidator getCustomValidator() {
        return mValidator;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        setError(null);

        return false;
    }

    private void initialize() {
        mValidator = new EditTextValidator(this);
        setOnTouchListener(this);
    }
}
public class EditTextValidator {
    private static final String TAG = EditTextValidator.class.getName();

    private enum ValidationResult {
        Ok, Rules, Mismatch
    }

    private EditText mParent;
    private Pattern mValidationPattern;
    private int mValidationErrorMsgId;
    private boolean mAllowEmpty;
    private EditText mMatchView;
    private int mMismatchMsgId;
    private int mMinLength;
    private int mMaxLength;
    private ValidationResult mValidationResult;

    public EditTextValidator(EditText parent) {
        this.mParent = parent;
    }

    public void setAllowEmpty(boolean allowEmpty) {
        this.mAllowEmpty = allowEmpty;
    }

    public void setValidationErrorMsgId(int validationErrorMsgId) {
        this.mValidationErrorMsgId = validationErrorMsgId;
    }

    public void setValidationRules(String strPattern, int validationErrorMsgId, boolean allowEmpty) {
        try {
            if (!TextUtils.isEmpty(strPattern)) {
                mValidationPattern = Pattern.compile(strPattern);
            }
        } catch (PatternSyntaxException e) {
            Log.e(TAG, e.getMessage(), e);
            ToastUtil.toastShort("Invalid validation pattern!");
        }

        this.mValidationErrorMsgId = validationErrorMsgId;
        this.mAllowEmpty = allowEmpty;
    }

    public void setValidLength(int min, int max) {
        mMinLength = min;
        mMaxLength = max;
    }

    public void shouldMatch(EditText matchView, int mismatchMsgId) {
        this.mMatchView = matchView;
        this.mMismatchMsgId = mismatchMsgId;
    }

    public boolean validate() {
        mValidationResult = ValidationResult.Ok;

        InputMethodManager imm = (InputMethodManager) mParent.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mParent.getWindowToken(), 0);

        final String text = mParent.getText().toString();
        final int length = text.length();

        if (mValidationResult == ValidationResult.Ok && !mAllowEmpty && 0 == text.length()) {
            mValidationResult = ValidationResult.Rules;
        }

        if (mValidationResult == ValidationResult.Ok) {
            if (mMinLength != 0 && length < mMinLength) {
                mValidationResult = ValidationResult.Rules;
            } else if (mMaxLength != 0 && length > mMaxLength) {
                mValidationResult = ValidationResult.Rules;
            }
        }

        if (mValidationResult == ValidationResult.Ok && mValidationPattern != null) {
            Matcher m = mValidationPattern.matcher(text);
            if (!m.matches())
                mValidationResult = ValidationResult.Rules;
        }

        if (mValidationResult == ValidationResult.Ok && mMatchView != null) {
            if (mMatchView.getText().toString().compareTo(text) != 0)
                mValidationResult = ValidationResult.Mismatch;
        }

        if (ValidationResult.Ok == mValidationResult) {
            mParent.setError(null);
        } else {
            CharSequence error = null;
            if (ValidationResult.Rules == mValidationResult)
                error = MyApplication.getContext().getText(mValidationErrorMsgId);
            else if (ValidationResult.Mismatch == mValidationResult)
                error = MyApplication.getContext().getText(mMismatchMsgId);

            mParent.setError(error);
            mParent.requestFocus();
        }

        return mValidationResult == ValidationResult.Ok;
    }
}
EditTextValidator.java

public class EditTextWithValidation extends EditText implements OnTouchListener {
    private EditTextValidator mValidator;

    public EditTextWithValidation(Context context) {
        super(context);

        initialize();
    }

    public EditTextWithValidation(Context context, AttributeSet attrs) {
        super(context, attrs);

        initialize();
    }

    public EditTextWithValidation(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        initialize();
    }

    public EditTextValidator getCustomValidator() {
        return mValidator;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        setError(null);

        return false;
    }

    private void initialize() {
        mValidator = new EditTextValidator(this);
        setOnTouchListener(this);
    }
}
public class EditTextValidator {
    private static final String TAG = EditTextValidator.class.getName();

    private enum ValidationResult {
        Ok, Rules, Mismatch
    }

    private EditText mParent;
    private Pattern mValidationPattern;
    private int mValidationErrorMsgId;
    private boolean mAllowEmpty;
    private EditText mMatchView;
    private int mMismatchMsgId;
    private int mMinLength;
    private int mMaxLength;
    private ValidationResult mValidationResult;

    public EditTextValidator(EditText parent) {
        this.mParent = parent;
    }

    public void setAllowEmpty(boolean allowEmpty) {
        this.mAllowEmpty = allowEmpty;
    }

    public void setValidationErrorMsgId(int validationErrorMsgId) {
        this.mValidationErrorMsgId = validationErrorMsgId;
    }

    public void setValidationRules(String strPattern, int validationErrorMsgId, boolean allowEmpty) {
        try {
            if (!TextUtils.isEmpty(strPattern)) {
                mValidationPattern = Pattern.compile(strPattern);
            }
        } catch (PatternSyntaxException e) {
            Log.e(TAG, e.getMessage(), e);
            ToastUtil.toastShort("Invalid validation pattern!");
        }

        this.mValidationErrorMsgId = validationErrorMsgId;
        this.mAllowEmpty = allowEmpty;
    }

    public void setValidLength(int min, int max) {
        mMinLength = min;
        mMaxLength = max;
    }

    public void shouldMatch(EditText matchView, int mismatchMsgId) {
        this.mMatchView = matchView;
        this.mMismatchMsgId = mismatchMsgId;
    }

    public boolean validate() {
        mValidationResult = ValidationResult.Ok;

        InputMethodManager imm = (InputMethodManager) mParent.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mParent.getWindowToken(), 0);

        final String text = mParent.getText().toString();
        final int length = text.length();

        if (mValidationResult == ValidationResult.Ok && !mAllowEmpty && 0 == text.length()) {
            mValidationResult = ValidationResult.Rules;
        }

        if (mValidationResult == ValidationResult.Ok) {
            if (mMinLength != 0 && length < mMinLength) {
                mValidationResult = ValidationResult.Rules;
            } else if (mMaxLength != 0 && length > mMaxLength) {
                mValidationResult = ValidationResult.Rules;
            }
        }

        if (mValidationResult == ValidationResult.Ok && mValidationPattern != null) {
            Matcher m = mValidationPattern.matcher(text);
            if (!m.matches())
                mValidationResult = ValidationResult.Rules;
        }

        if (mValidationResult == ValidationResult.Ok && mMatchView != null) {
            if (mMatchView.getText().toString().compareTo(text) != 0)
                mValidationResult = ValidationResult.Mismatch;
        }

        if (ValidationResult.Ok == mValidationResult) {
            mParent.setError(null);
        } else {
            CharSequence error = null;
            if (ValidationResult.Rules == mValidationResult)
                error = MyApplication.getContext().getText(mValidationErrorMsgId);
            else if (ValidationResult.Mismatch == mValidationResult)
                error = MyApplication.getContext().getText(mMismatchMsgId);

            mParent.setError(error);
            mParent.requestFocus();
        }

        return mValidationResult == ValidationResult.Ok;
    }
}
有这样的事吗

啊。。是的,有一个,你可以找到

它使用但不限于注释为您进行表单验证。要了解图书馆的功能,请访问以下我描述了图书馆使用情况的地方

如果您想编写新规则,您可以随时扩展该类

PS:我是库的作者。

安装此应用程序:

转到:
Utils
->
Android验证程序
->
查看演示


这个应用程序中还有很多其他很酷的库。好的是,如果您喜欢,您可以查看每个库的演示,并获得该库的githubrepo链接。它非常有用。

我知道这很旧,但是你可以试试这个,然后访问这个和这个来获取使用示例,因为我发现主库的“如何理解”有点难理解。

有这样的东西吗?
没有……手动检查字符串长度非常感谢。。。这对我的验证有很大帮助。