Comment masquer une erreur TextInputLayout
après avoir saisi un texte dans EditText
. Est-ce possible?
comment puis-je atteindre ceci ou je fais quelque chose de mal ici !!
code
layoutEdtPhone =(TextInputLayout)rootView.findViewById(R.id.layoutEdtPhone);
layoutEdtPhone.setErrorEnabled(true);
layoutEdtPhone.setError(getString(R.string.ui_no_phone_toast));
layoutEdtPassword = (TextInputLayout)rootView.findViewById(R.id.layoutEdtPassword);
layoutEdtPassword.setErrorEnabled(true);
layoutEdtPassword.setError(getString(R.string.ui_no_password_toast));
edtPhone=(EditText)rootView.findViewById(R.id.edtPhone);
edtPassword=(EditText)rootView.findViewById(R.id.edtPassword);
xml
<EditText
Android:id="@+id/edtPhone"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="100dp"
Android:background="@drawable/edt_background_selector"
Android:drawableLeft="@drawable/phone_icon"
Android:drawableStart="@drawable/phone_icon"
Android:hint="@string/phone"
Android:inputType="phone"
Android:padding="5dip"
Android:singleLine="true"
Android:textSize="14sp" />
</Android.support.design.widget.TextInputLayout>
<Android.support.design.widget.TextInputLayout
Android:id="@+id/layoutEdtPassword"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" >
<EditText
Android:id="@+id/edtPassword"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="16dp"
Android:background="@drawable/edt_background_selector"
Android:drawableLeft="@drawable/password_icon"
Android:drawableStart="@drawable/password_icon"
Android:hint="@string/password"
Android:inputType="textPassword"
Android:padding="5dip"
Android:singleLine="true"
Android:textSize="14sp" />
</Android.support.design.widget.TextInputLayout>
Pour illustrer davantage la réponse donnée par Prithviraj, TextInputLayout
ne fait pas la validation elle-même. C'est juste un mécanisme pour montrer l'erreur ou l'indice. Vous êtes responsable de la définition/suppression de l'erreur. Voici comment vous pouvez le faire. Notez qu'en plus de TextChangedListener, vous pouvez également avoir besoin de OnFocusChangeListener pour définir l'erreur lorsque l'utilisateur passe au deuxième texte édité sans effectuer aucune modification dans le premier champ.
protected void onCreate(Bundle savedInstanceState) {
//.....
edtPhone.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
validateEditText(s);
}
});
edtPhone.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
validateEditText(((EditText) v).getText());
}
}
});
}
private void validateEditText(Editable s) {
if (!TextUtils.isEmpty(s)) {
layoutEdtPhone.setError(null);
}
else{
layoutEdtPhone.setError(getString(R.string.ui_no_password_toast));
}
}
}
Vous pouvez définir layoutEdtPhone.setErrorEnabled(false);
Faire
mTextInputLayout.setError(null);
pour effacer le message d'erreur.
Une bonne pratique peut être une méthode pour vérifier les erreurs comme ceci:
@Override
public void checkErrorBeforeAction() {
boolean error = false;
mTextInputLayout.setError(null);
if (mEditText.getText().toString().length == 0)) {
mTextInputLayout.setError("Field empty");
}
else if (mEditText.getText().toString().isValid) { // Other condition
mTextInputLayout.setError("Field is invalid");
}
if (!error) {
// Call action
}
}
De cette façon, le message d'erreur est actualisé avant d'en définir un nouveau.
J'ai utilisé @TextChanged de ButterKnife et a travaillé pour moi, regardez:
@Bind(R.id.layoutEdtPhone)
TextInputLayout tlayoutEdtPhone;
@Bind(R.id.edtPhone)
EditText edtPhone;
//start ButterKnife (I spent the URL with full description for initilize)
@OnTextChanged(R.id.edtPhone)
public void changedTextOnEditPhone() {
tlayoutEdtPhone.setError("");
}
Si vous voulez en savoir plus sur ButterKnife, j’ai écrit un article plus détaillé, mais dans ma langue maternelle, c’est-à-dire pt_br. http://blog.alura.com.br/aumentando-a-produtividade-com-butter-knife-no-Android/
textInputLatout.getEditText().addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() < 1) {
textInputLayout.setErrorEnabled(true);
textInputLayout.setError("Please enter a value");
}
if (s.length() > 0) {
textInputLayout.setError(null);
textInputLayout.setErrorEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
Si vous souhaitez supprimer l'affichage d'erreur de TextInputLayout, utilisez: -
YourtextInputLayout.setErrorEnabled(false);
else Si vous souhaitez supprimer l’affichage des erreurs d’edittextfield, utilisez: -
edittext_id.setError(null);
Je suggère d'utiliser Textwatcher fucntion dans Android pour une gestion de validation plus efficace ..
par exemple:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!validatefName()) {
return;
}
}
});