web-dev-qa-db-fra.com

Créez Android EditText pour afficher le message d'erreur décrit par google.

J'ai besoin d'un EditText qui ressemble à ceci surError:

enter image description here

appeler onError ressemble à ceci à la place:

enter image description here

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

min SDK est 1

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

Je vous remercie

132
kmn

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

En suivant un exemple de base:

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>

Note: Si vous définissez app:errorEnabled="true" comme attribut de la variable TextInputLayout, sa taille ne changera pas une fois qu'une erreur sera affichée. Elle bloque donc l'espace.

Code

Afin d’afficher l’Erreur sous la EditText, il vous suffit d’appeler #setError sur la 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

picture showing the edit text with the error message

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


Remarque

Pour utiliser TextInputLayout, vous devez ajouter ce qui suit à vos dépendances build.gradle:

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

Définir une couleur personnalisée

Par défaut, la ligne de la EditText sera rouge. Si vous devez 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 fonction clearColorFilter, comme ceci:

editText.getBackground().clearColorFilter();
302
reVerse

Votre EditText devrait être enveloppé dans un TextInputLayout

<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 error sur TextInputLayout

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

Vous devez ajouter une dépendance à la bibliothèque de support de conception. Ajouter cette ligne dans vos dépendances

compile 'com.Android.support:design:22.2.0'
6
aqel

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

Ces conteneur et confinement ont une double fonctionnalité pour les erreurs de paramétrage. La fonctionnalité dont vous avez besoin est celle du conteneur. Mais vous pourriez avoir besoin d'une version minimale de 23 pour cela.

5
Zon

la réponse de reVerse est excellente, mais elle n'a pas indiqué comment supprimer le type d'infobulle d'erreur flottante.

Vous aurez besoin de edittext.setError(null) pour l'enlever.
En outre, comme quelqu'un l'a fait remarquer, vous n'avez pas besoin de TextInputLayout.setErrorEnabled(true)

mise en page

<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);
3
ericn
TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");
1
Max Bazaleev

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

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

0
B.shruti