Comment puis-je changer la couleur du message d'erreur qui peut être défini pour apparaître sous le champ de texte dans un TextInputLayout
(via setError(...)
- voir l'état d'erreur ici )?
Il apparaît normalement sous la forme d'une couleur rouge, que je souhaite modifier. Quels noms / clés d'élément dois-je utiliser dans mon styles.xml
fichier pour cibler la couleur?
Merci d'avance.
Éditer:
app:errorTextAppearance
Clé ajoutée à 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'apparence 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 ainsi que le message d'erreur sont colorés (captures d'écran de l'émulateur Android mis à l'échelle) :
Régulier (pas d'erreur):
État d'erreur:
Edit 2 / Résultat:
Lorsque le message d'erreur apparaît, l'indication au-dessus du champ prend la même couleur que le message d'erreur, remplaçant la couleur de l'indication - c'est par conception.
la source
Réponses:
Créez un style personnalisé qui utilise
@android:style/TextAppearance
comme parent dans votrestyles.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: Réglez l'indication sur l'objet, qui est à l' intérieur de votre TextInputLayout (
EditText
,TextView
, etc.) de tenir des couleurs différentes pour l'indication et l'erreur.la source
app:errorTextAppearance
?<android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>
. Alors oui, c'est un autre TextView, c'est pourquoi il ne prend pas la couleur d'erreur du TextInputLayout.parent
surparent="TextAppearance.Design.Error"
. De cette façon, il conserve la taille du texte par défaut et tous les autres attributs, mais vous permet de personnaliser spécifiquement la couleur d'erreur, ce qui était le but de la question à l'étude.En fait, pour changer uniquement la couleur du message d'erreur, vous pouvez définir
textColorError
dans votre thème (et également définircolorControlNormal
etcolorControlActivated
pour le widget général et la couleur du texte de l'indice).TextInputLayout
prend cet attribut. REMARQUE: si vous définissezerrorTextAppearance
un style personnalisé, celatextColorError
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>
la source
textColorError
introuvable), mais j'ai réussi à définir l'colorError
attribut dans mon thème. Il semble que chaque version d'Android / Support Library possède ses propres attributs de thème.<item name="colorError">@color/error</item>
fonctionne bienUne note latérale. J'ai essayé la solution acceptée avec
errorTextAppereance
. Cela fonctionne vraiment bien mais au début, la couleur de soulignement d'entrée ne changeait pas après l'application d'un nouveauerrorTextAppereance
style. 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 changé l'ordre de ces deux méthodes, le texte et la couleur de soulignement 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>
la source
J'avais besoin de le faire de manière dynamique. Utilisation de 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.la source
Avec le
TextInputLayout
inclus dans la bibliothèque de composants matériels, utilisez simplement l'app:errorTextColor
attribut.<com.google.android.material.textfield.TextInputLayout app:errorTextColor="@color/...." .../>
Dans un style personnalisé, vous pouvez utiliser:
<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" > <item name="errorTextColor">@color/...</item> ... </style>
la source
MISE À JOUR
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(); } }
la source
Si vous utilisez com.google.android.material.textfield.TextInputLayout cette disposition d'entrée, vous ne définissez qu'un seul 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>
la source
Selon les besoins, on peut changer / définir la couleur du texte TextInputLayout dynamiquement ou directement dans le fichier XML de mise en page. Voici des exemples d'extraits de code
Créez un style personnalisé qui utilise @android: style / TextAppearance comme parent dans votre fichier styles.xml :
<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:
<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">
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 le thème de votre 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>
la source
J'ai regardé dans la source TextInputLayout et j'ai réalisé que la couleur du texte d'erreur était obtenue à partir de colors.xml. Ajoutez simplement ceci à votre colors.xml:
<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>
la source