[JAVA] So implementieren Sie TextInputLayout mit Validierungsfunktion

Überblick

Erweitert das TextInputLayout von Android und beschreibt, wie ValidationTextInputLayout mit Validierung implementiert wird. Mit ValidationTextInputLayout können Sie erforderliche, Validierungselemente und Fehlermeldungen aus XML angeben, indem Sie benutzerdefinierte Attribute hinzufügen.

Betriebsbeispiel

animation

Die Form, die Sie anstreben sollten

Im Folgenden wird das Eingabefeld der E-Mail-Adresse benötigt und geprüft, ob der Eingabeinhalt im E-Mail-Format vorliegt. Wenn es sich nicht um den E-Mail-Inhalt handelt, wird die durch error_text angegebene Zeichenfolge angezeigt.

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

Wie es funktioniert

Benutzerdefinierte Attributdefinition

Definieren Sie benutzerdefinierte Attribute in res / values / attrs.xml. ValidationTextInputLayout, das später definiert wird, empfängt Attribute und ändert das Verhalten.

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

Definition des Validierungstyps

Definieren Sie ValidationType als Aufzählungstyp. Dieser Vorgang ist nicht erforderlich, verbessert jedoch die Sichtbarkeit des Quellcodes. Der Wert von enum und der in attrs.xml definierte Wert müssen übereinstimmen.

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

TextInputLayout-Erweiterung

Ruft den von initAttrs () angegebenen Attributwert ab. updateError () validiert und gibt bei Bedarf eine Fehlermeldung aus. Von außen können Sie durch Aufrufen von isValidated () feststellen, ob die Validierung bestanden wurde.

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

Stichprobe

Ich habe ein Projekt, das unter Validation-Text-Input-Layout @ github funktioniert.

iOS-Version

Eine ähnliche Verarbeitung ist in iOS implementiert. Weitere Informationen finden Sie unter Texteingabe-Layout @ github.

Recommended Posts

So implementieren Sie TextInputLayout mit Validierungsfunktion
Versuchen Sie, eine Anmeldefunktion mit Spring-Boot zu implementieren
So implementieren Sie die Brotkrumenfunktion mit gretel
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
[Für Anfänger] So implementieren Sie die Löschfunktion
So implementieren Sie UICollectionView mit Code nur in Swift
So fügen Sie die ActionText-Funktion hinzu
So erstellen Sie eine mit Ruby erstellte LINE-Messaging-Funktion
Wie man mit html.erb nummeriert (nummeriert)
So aktualisieren Sie mit activerecord-import
[Rails] Verwendung der Validierung
[Rails] So implementieren Sie Scraping
[Java] So implementieren Sie Multithreading
Wie fange ich mit schlank an?
So legen Sie die Validierung für time_field fest
Wie man ein Zeichen mit "~" einschließt
Versuchen Sie, die iOS14-Widget-Funktion zu implementieren
Wie man mssql-tools mit alpine benutzt
[Rails] So implementieren Sie die Sternebewertung
So fügen Sie die Löschfunktion hinzu
So starten Sie Camunda mit Docker
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Verwendung von MinIO mit derselben Funktion wie S3 Verwenden Sie Docker-Compose
So beschneiden Sie ein Bild in libGDX
So passen Sie TextPosition mit der iOS-Tastaturerweiterung an
So teilen Sie Dateien mit Docker Toolbox
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
So kompilieren Sie Java mit VsCode & Ant
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
[Android] Wie man mit dunklen Themen umgeht
Verwendung von BootStrap mit Play Framework
So wechseln Sie Miniaturbilder mit JavaScript
[Hinweis] Erste Schritte mit Rspec
API-basierte Steuerung mit cancancan
So erreichen Sie den Dateidownload mit Feign
So erzwingen Sie Codierungskonventionen in Java
So aktualisieren Sie verwandte Modelle mit accept_nested_attributes_for
So setzen Sie JAVA_HOME mit dem Appassembler-Maven-Plugin von Maven
So behandeln Sie Anmeldefehler mit devise
So implementieren Sie Ranking-Funktionen in Rails
[Verarbeitung × Java] Verwendung der Funktion
So löschen Sie Daten mit einem externen Schlüssel
So testen Sie den privaten Bereich mit JUnit