[JAVA] Comment implémenter TextInputLayout avec la fonction de validation

Aperçu

Étend TextInputLayout d'Android et décrit comment implémenter ValidationTextInputLayout avec validation. ValidationTextInputLayout vous permet de spécifier les éléments de validation requis et les messages d'erreur à partir de XML en ajoutant des attributs personnalisés.

Exemple d'opération

animation

La forme que vous devriez viser

Dans ce qui suit, le champ de saisie de l'adresse e-mail est obligatoire et il est vérifié si le contenu d'entrée est au format e-mail. S'il ne s'agit pas du contenu de l'e-mail, la chaîne de caractères spécifiée par error_text s'affiche.

<ValidationTextInputLayout
    app:required="true"
    app:validation_type="email"
    app:error_text="Email value is invalidated"
    >
    <EditText
        android:hint="Email (Required)"
        />
</ValidationTextInputLayout>

Comment ça fonctionne

Définition d'attribut personnalisé

Définissez des attributs personnalisés dans res / values / attrs.xml. ValidationTextInputLayout, qui sera défini ultérieurement, reçoit des attributs et modifie le comportement.

<?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>

Définition du type de validation

Définissez ValidationType comme type d'énumération. Ce processus n'est pas obligatoire, mais il améliore la visibilité du code source. La valeur de enum et la valeur définie dans attrs.xml doivent correspondre.

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

Extension TextInputLayout

Obtient la valeur d'attribut spécifiée par initAttrs (). updateError () valide et génère un message d'erreur si nécessaire. De l'extérieur, vous pouvez déterminer si la validation a réussi en appelant 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();
    }
}

échantillon

J'ai un projet qui fonctionne à Validation-Text-Input-Layout @ github.

version iOS

Un traitement similaire est mis en œuvre dans iOS. Veuillez consulter Text-Input-Layout @ github.

Recommended Posts

Comment implémenter TextInputLayout avec la fonction de validation
Essayez d'implémenter une fonction de connexion avec Spring-Boot
Comment mettre en œuvre la fonction de chapelure avec Gretel
Essayez d'implémenter la fonction de connexion avec Spring Boot
[Pour les débutants] Comment implémenter la fonction de suppression
Comment implémenter UICollectionView avec du code uniquement dans Swift
Comment ajouter la fonction ActionText
Comment créer une fonction de messagerie LINE avec Ruby
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import
[Rails] Comment utiliser la validation
[Rails] Comment mettre en œuvre le scraping
[Java] Comment implémenter le multithreading
Comment démarrer avec Slim
Comment spécifier la validation pour time_field
Comment entourer n'importe quel caractère avec "~"
Essayez d'implémenter la fonction Widget iOS14
Comment utiliser mssql-tools avec Alpine
[Rails] Comment mettre en œuvre le classement par étoiles
Comment ajouter la fonction de suppression
Comment démarrer Camunda avec Docker
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
Comment utiliser MinIO avec la même fonction que S3 Utiliser docker-compose
Comment recadrer une image avec libGDX
Comment ajuster TextPosition avec l'extension de clavier iOS
Comment partager des fichiers avec Docker Toolbox
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
[Android] Comment gérer les thèmes sombres
Comment utiliser BootStrap avec Play Framework
Comment changer d'images miniatures avec JavaScript
[Note] Comment démarrer avec Rspec
Comment faire un contrôle basé sur l'API avec cancancan
Comment réaliser le téléchargement de fichiers avec Feign
Comment appliquer les conventions de codage en Java
Comment mettre à jour les modèles associés avec accepte_nested_attributes_for
Comment définir JAVA_HOME avec l'appassembler-maven-plugin de Maven
Comment gérer les erreurs de connexion avec l'appareil
Comment implémenter la fonctionnalité de classement dans Rails
[Traitement × Java] Comment utiliser la fonction
Comment supprimer des données avec une clé externe
Comment tester l'étendue privée avec JUnit