인증 기능이 있는 TextInputLayout 설치 방법

17749 단어 AndroidJava

개요


안드로이드를 확장한 텍스트 인풋 Layout은 발리 기능이 있는 Validation Text Input Layout의 설치 방법을 설명한다.
ValidationText InputLayout에서 사용자 정의 속성을 추가하여 xml에 필요한 알림 항목, 오류 정보를 지정할 수 있습니다.

작업 예



목표 형식


다음은 전자 우편 주소의 입력 표시줄이어야 하며, 입력 내용이 전자 우편 형식인지 확인해야 한다.
만약 전자 우편 내용이 아니라면, errortext로 지정한 문자열을 표시합니다.
<ValidationTextInputLayout
    app:required="true"
    app:validation_type="email"
    app:error_text="Email value is invalidated"
    >
    <EditText
        android:hint="Email (Required)"
        />
</ValidationTextInputLayout>

구조


사용자 정의 속성 정의


res/values/attrs.xml에서 사용자 정의 속성을 정의합니다.
나중에 정의된 ValidationText InputLayout에서 속성 변경 동작을 적용합니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ValidationTextInputLayout">
        <attr name="required" format="boolean" />
        <attr name="validation_type">
            <enum name="post_code" value="0" />
            <enum name="email" value="1" />
        </attr>
        <attr name="error_text" format="string" />
    </declare-styleable>
</resources>

유효성 검사 유형 정의


ValidationType을 열거 유형으로 정의합니다.
이 처리는 필수적이지는 않지만 원본 코드의 전망을 높일 수 있다.
um값과attrs를 만듭니다.xml에 정의된 값은 일치해야 합니다.
public enum ValidationType {
    PostCode(0), Email(1),
    Null(9999);
    private int value;

    ValidationType(int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    public static ValidationType valueOf(final int value) {
        ValidationType type = Null;
        for (ValidationType validationType : ValidationType.values()) {
            if (validationType.getValue() == value) {
                type = validationType;
                break;
            }
        }
        return type;
    }
}

Text InputLayout의 확장


initAttrs()에서 지정한 속성 값을 가져옵니다.
업데이트Error()에서 필요한 경우 오류 정보를 출력하는지 확인합니다.
isValidated()를 외부에서 호출하면 검증이 통과되었는지 여부를 판단할 수 있습니다.
public class ValidationTextInputLayout extends TextInputLayout {
    private static final String PATTERN_POST_CODE = "\\d{7}";

    private boolean isRequired = false;
    private ValidationType validationType = ValidationType.Null;
    private String errorText;

    public ValidationTextInputLayout(Context context) {
        super(context);
    }

    public ValidationTextInputLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        initAttrs(context, attrs);
    }

    public ValidationTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(context, attrs);
    }

    private void initAttrs(final Context context, AttributeSet attrs) {
        final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ValidationTextInputLayout);

        isRequired = typedArray.getBoolean(R.styleable.ValidationTextInputLayout_required, false);

        final int validationTypeValue = typedArray.getInt(
                R.styleable.ValidationTextInputLayout_validation_type, ValidationType.Null.getValue());
        validationType = ValidationType.valueOf(validationTypeValue);

        String errorText = typedArray.getString(R.styleable.ValidationTextInputLayout_error_text);
        if (TextUtils.isEmpty(errorText)) {
            errorText = getContext().getString(R.string.error_default_text);
        }
        this.errorText = errorText;
    }

    public boolean isValidated() {
        updateError();

        final boolean isValidated = TextUtils.isEmpty(getError());
        setErrorEnabled(!isValidated);
        return isValidated;
    }

    private void updateError() {
        final String text = getEditText().getText().toString();
        final boolean isEmpty = TextUtils.isEmpty(text);
        setError(null);

        switch (validationType) {
            case PostCode:
                if (!isPostCode(text)) {
                    setError(errorText);
                }
                break;
            case Email:
                if (!isEmail(text)) {
                    setError(errorText);
                }
                break;
            default:
                break;
        }

        if (isEmpty) {
            if (isRequired) {
                setError("Fill in this form");
            } else {
                setError(null);
            }
        }
    }

    private boolean isPostCode(final String str) {
        return Pattern.compile(PATTERN_POST_CODE).matcher(str).matches();
    }

    private boolean isEmail(final String str) {
        return Patterns.EMAIL_ADDRESS.matcher(str).matches();
    }
}

견본


Validation-Text-Input-Layout@github에 실행할 항목이 있습니다.

iOS 버전


iOS에서도 동일하게 처리됩니다.
보세요Text-Input-Layout@github.

좋은 웹페이지 즐겨찾기