É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.
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>
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é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;
}
}
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();
}
}
J'ai un projet qui fonctionne à Validation-Text-Input-Layout @ github.
Un traitement similaire est mis en œuvre dans iOS. Veuillez consulter Text-Input-Layout @ github.
Recommended Posts