web-dev-qa-db-fra.com

Comment définir la couleur du message d'erreur TextInputLayout?

Comment changer la couleur du message d'erreur pouvant apparaître sous le champ de texte dans un TextInputLayout (via setError(...) - voir l'état d'erreur ici ) ?

Il apparaît normalement en rouge, ce que je veux changer. Quels noms d’éléments/clés dois-je utiliser dans mon styles.xml fichier pour cibler la couleur?

Merci d'avance.


Modifier:

Ajoutée app:errorTextAppearance clé de mon TextInputLayout:

<Android.support.design.widget.TextInputLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="8dp"
        Android:id="@+id/welcome_current_week_container"
        app:errorTextAppearance="@style/WelcomeErrorAppearance">
        <EditText
            ..../>
    </Android.support.design.widget.TextInputLayout>
</LinearLayout>

et l'apparition de l'erreur (définie en vert pour le test):

<style name="WelcomeErrorAppearance" parent="@Android:style/TextAppearance">
    <item name="Android:textColor">@Android:color/holo_green_dark</item>
</style>

Le résultat est que l'indice et le message d'erreur sont colorés (captures d'écran de scaled Android Emulator)!:

Normal (pas d'erreur):

Before Image

état d'erreur:

After Image

Édition 2/Résultat:

Lorsque le message d'erreur apparaît, le conseil situé au-dessus du champ prend la même couleur que le message d'erreur, remplaçant ainsi la couleur du conseil - ceci est voulu par la conception même du produit.

71
Seb Jachec

Créez un style personnalisé qui utilise @Android:style/TextAppearance en tant que parent dans votre styles.xml fichier:

<style name="error_appearance" parent="@Android:style/TextAppearance">
    <item name="Android:textColor">@color/red_500</item>
    <item name="Android:textSize">12sp</item>
</style>

Et utilisez-le dans votre widget TextInputLayout:

 <Android.support.design.widget.TextInputLayout
            Android:id="@+id/emailInputLayout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            app:errorTextAppearance="@style/error_appearance">

error example

Edit: Définissez l’indice sur l’objet, qui se trouve dans votre TextInputLayout (EditText, TextView, etc.) de manière à conserver des couleurs différentes pour l’indicateur et l’erreur.

127
dabo248

En fait, pour changer uniquement la couleur du message d'erreur, vous pouvez définir textColorError dans votre thème (et également définir colorControlNormal et colorControlActivated pour le widget général et la couleur du texte indicateur). TextInputLayout récupère cet attribut. NOTE: Si vous définissez errorTextAppearance dans un style personnalisé, alors textColorError n'aura aucun effet.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">@color/control_normal</item>
    <item name="colorControlActivated">@color/control_activated</item>
    <item name="textColorError">@color/error</item>
    <!-- other styles... -->
</style>

Et dans votre AndroidManifest.xml:

<application
    Android:theme="@style/AppTheme"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name">

    <!-- ... -->

</application>
25
Vicky Chijwani

Je devais le faire dynamiquement. En utilisant la réflexion:

public static void setErrorTextColor(TextInputLayout textInputLayout, int color) {
  try {
    Field fErrorView = TextInputLayout.class.getDeclaredField("mErrorView");
    fErrorView.setAccessible(true);
    TextView mErrorView = (TextView) fErrorView.get(textInputLayout);
    Field fCurTextColor = TextView.class.getDeclaredField("mCurTextColor");
    fCurTextColor.setAccessible(true);
    fCurTextColor.set(mErrorView, color);
  } catch (Exception e) {
    e.printStackTrace();
  }
}

Vous devrez appeler textInputLayout.setErrorEnabled(true) avant d'appeler la méthode ci-dessus pour que cela fonctionne.

6
Jared Rummler

Un côté note. J'ai essayé la solution acceptée avec errorTextAppereance. Cela fonctionne vraiment bien, mais au début, la couleur soulignée en entrée ne changeait pas après l’application d’un nouveau style errorTextAppereance. Je vois qu'il y a quelques commentaires et que d'autres personnes vivent le même problème.

Dans mon cas, cela se produisait lorsque je définissais un nouveau style après avoir défini un nouveau texte d'erreur. Comme ça:

passwordInputLayout.error = "Password strength"
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)

Après avoir modifié l'ordre de ces deux méthodes, le texte et la couleur soulignée changent comme prévu.

passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
passwordInputLayout.error = "Password strength"

Et le style d’apparence du texte d’erreur ressemble à ceci:

<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
    <item name="Android:textColor">@color/purple</item>
</style>
5
Ivan Marić

MISE À JOUR

S'il vous plaît utiliser une vue personnalisée à la place et pas cela


Une version modifiée de la réponse de @ jared qui fonctionne dans mon cas:

public static void setErrorTextColor(TextInputLayout textInputLayout, int color) {
    try {
        Field fErrorView = TextInputLayout.class.getDeclaredField("mErrorView");
        fErrorView.setAccessible(true);
        TextView mErrorView = (TextView)fErrorView.get(textInputLayout);
        mErrorView.setTextColor(color);
        mErrorView.requestLayout();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
1
Dr. aNdRO

Si vous utilisez com.google.Android.material.textfield.TextInputLayout cette disposition d'entrée que vous venez de définir un style

<com.google.Android.material.textfield.TextInputLayout
                        Android:id="@+id/textInputLayoutPassword"
                        style="@style/LoginTextInputLayoutStyle"



<style name="LoginTextInputLayoutStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
        <item name="boxStrokeColor">@color/text_input_box</item>
        <item name="errorTextColor">@color/colorRed</item>
    </style>
0
Mohit Suthar

Selon les besoins, il est possible de modifier/définir la couleur du texte TextInputLayout de manière dynamique ou directement dans le fichier XML de présentation. Vous trouverez ci-dessous des extraits de code.

Créez un style personnalisé qui utilise @ Android: style/TextAppearance en tant que parent dans votre styles.xml = fichier:

<style name="style_error_appearance" parent="@Android:style/TextAppearance">
    <item name="Android:textColor">@color/color_error</item>
    <item name="Android:textSize">11sp</item>
</style>

Et utilisez-le dans votre widget TextInputLayout:

  1. Directement en format XML
 <Android.support.design.widget.TextInputLayout
            Android:id="@+id/your_input_layout"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            app:errorTextAppearance="@style/style_error_appearance">
  1. Dynamiquement dans votre classe
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);

Si vous souhaitez définir une couleur de texte d'erreur unique/identique pour votre application, définissez la couleur du texte dans votre thème de l'application

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Error text color... -->
    <item name="textColorError">@color/color_error</item>
    <!-- other styles... -->
</style>

Et dans votre AndroidManifest.xml:

<application
    Android:theme="@style/AppTheme"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/your_app_name">

    <!-- ... -->

</application>
0
Rupesh Yadav