Concevez Android EditText pour afficher le message d'erreur comme décrit par Google

151

J'ai besoin d'un EditTextqui ressemble à ceci onError:

entrez la description de l'image ici

appeler onError ressemble à ceci à la place:

entrez la description de l'image ici

Remarque: l'application fonctionne sur le SDK 19 (4.4.2)

SDK min est 1

Existe-t-il une méthode similaire à setError qui fait cela automatiquement ou dois-je écrire le code pour cela?

Je vous remercie

kmn
la source
1
Il est peu probable que vous puissiez faire cela avec juste un fichier EditText. Plus probablement, vous aurez besoin de quelque chose qui l'enveloppe EditTextou y ajoute autrement. Voir github.com/rengwuxian/MaterialEditText .
CommonsWare

Réponses:

330

Il n'est pas nécessaire d'utiliser une bibliothèque tierce puisque Google a introduit le TextInputLayoutdans le cadre du design-support-library.

En suivant un exemple basique:

Disposition

<android.support.design.widget.TextInputLayout
    android:id="@+id/text_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:errorEnabled="true">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

</android.support.design.widget.TextInputLayout>

Remarque: en définissant app:errorEnabled="true"comme attribut de TextInputLayout, sa taille ne changera pas une fois qu'une erreur est affichée - donc cela bloque essentiellement l'espace.

Code

Afin d'afficher l'erreur ci-dessous, EditTextvous devez simplement appeler #setErrorle TextInputLayout(PAS sur l'enfant EditText):

TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");

Résultat

image montrant le texte d'édition avec le message d'erreur

Pour masquer l'erreur et réinitialiser la teinte, appelez simplement til.setError(null).


Remarque

Pour utiliser le, TextInputLayoutvous devez ajouter les éléments suivants à vos build.gradledépendances:

dependencies {
    compile 'com.android.support:design:25.1.0'
}

Définition d'une couleur personnalisée

Par défaut, la ligne du EditTextsera rouge. Si vous avez besoin d'afficher une couleur différente, vous pouvez utiliser le code suivant dès que vous appelez setError.

editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);

Pour l'effacer, appelez simplement la clearColorFilterfonction, comme ceci:

editText.getBackground().clearColorFilter();
inverser
la source
3
Oui ! C'est tout ! Mais comment rendre la ligne rouge?
kmn
3
@kmn Rendre la ligne rouge ne sort pas de la boîte, vous devez donc le faire vous-même. Voir ma modification. En termes de déplacement de l'indice: ce n'est absolument pas possible.
revoir le
5
@Alessio J'ai juste essayé de dire que cela devrait fonctionner lorsque vous étendez AppCompatActivity. Néanmoins: depuis appcompat-v23, il n'est plus nécessaire de définir le colorFilter, dès que vous appelez textInputLayout.setError("Error messsage")la couleur du EditTextdevrait devenir rouge. Pour le réinitialiser, il suffit d'appeler textInputLayout.setError(null).
revoir
3
editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);n'est plus nécessaire avec la dernière bibliothèque de support
Antoine Bolvy
13
Je voulais juste noter, car c'est un si petit détail - j'avais ce problème en appelant setError sur le EditText, pas le TextInputLayout. J'ai vu cette réponse et je ne pouvais toujours pas comprendre ce que j'avais besoin de changer. Chose très facile à manquer.
h_k
8

Appelez myTextInputLayout.setError()au lieu de myEditText.setError().

Ces conteneurs et confinements ont une double fonctionnalité sur les erreurs de réglage. La fonctionnalité dont vous avez besoin est celle de Container. Mais vous pourriez avoir besoin d'une version minimale de 23 pour cela.

Zon
la source
7

Votre EditTextdevrait être enveloppé dans unTextInputLayout

<android.support.design.widget.TextInputLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tilEmail">

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        android:ems="10"
        android:id="@+id/etEmail"
        android:hint="Email"
        android:layout_marginTop="10dp"
        />

</android.support.design.widget.TextInputLayout>

Pour obtenir un message d'erreur comme vous le souhaitez, définissez erreur sur TextInputLayout

TextInputLayout tilEmail = (TextInputLayout) findViewById(R.id.tilEmail);
if (error){
    tilEmail.setError("Invalid email id");    
}

Vous devez ajouter une dépendance de bibliothèque de support de conception. Ajoutez cette ligne dans vos dépendances gradle

compile 'com.android.support:design:22.2.0'
aqel
la source
4

La réponse de reVerse est excellente, mais elle n'a pas indiqué comment supprimer l'info-bulle d'erreur flottante

Vous devrez edittext.setError(null)supprimer cela.
De plus, comme quelqu'un l'a souligné, vous n'avez pas besoinTextInputLayout.setErrorEnabled(true)

Disposition

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter something" />
</android.support.design.widget.TextInputLayout>

Code

TextInputLayout til = (TextInputLayout) editText.getParent();
til.setError("Your input is not valid...");
editText.setError(null);
Ericn
la source
1
TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");
Max Bazaleev
la source
7
setErrorEnabled non nécessaire
JacksOnF1re
0

Si quelqu'un est toujours confronté à l'erreur en utilisant la bibliothèque de conception de Google comme mentionné dans la réponse, veuillez l'utiliser comme indiqué par @h_k, qui est -

Au lieu d'appeler setError sur TextInputLayout , vous pouvez utiliser setError sur EditText lui-même.

B.shruti
la source
0
private EditText edt_firstName;
private String firstName;

edt_firstName = findViewById(R.id.edt_firstName);

private void validateData() {
 firstName = edt_firstName.getText().toString().trim();
 if (!firstName.isEmpty(){
//here api call for ....
}else{
if (firstName.isEmpty()) {
                edt_firstName.setError("Please Enter First Name");
                edt_firstName.requestFocus();
            } 
}
}
MEGHA DOBARIYA
la source
Lorsque vous répondez à une ancienne question, votre réponse serait beaucoup plus utile aux autres utilisateurs de StackOverflow si vous incluiez un contexte pour expliquer comment votre réponse aide, en particulier pour une question qui a déjà une réponse acceptée. Voir: Comment écrire une bonne réponse .
David Buck le