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.
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>
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>
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;
}
}
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();
}
}
Ich habe ein Projekt, das unter Validation-Text-Input-Layout @ github funktioniert.
Eine ähnliche Verarbeitung ist in iOS implementiert. Weitere Informationen finden Sie unter Texteingabe-Layout @ github.
Recommended Posts