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):
état d'erreur:
É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.
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">
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.
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>
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.
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>
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();
}
}
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>
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:
- 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">
- 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>