How can I change the colour of the error message that can be set to appear below the text field in a TextInputLayout
(via setError(...)
– see error
If you are using com.google.android.material.textfield.TextInputLayout this input layout than you just set one 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>
I needed to do this dynamically. Using reflection:
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();
}
}
You will need to call textInputLayout.setErrorEnabled(true)
before invoking the above method for this to work.
With the TextInputLayout included in the Material Components Library just use the app:errorTextColor
attribute.
<com.google.android.material.textfield.TextInputLayout
app:errorTextColor="@color/...."
.../>
In a custom style you can use:
<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" >
<item name="errorTextColor">@color/...</item>
...
</style>
One side note. I have tried the accepted solution one with errorTextAppereance
.
It works really good but at first, the input underline color was not changing after applying a new errorTextAppereance
style. I see there are a few comments and that other people are experiencing the same issue.
In my case, this was happening when I was setting a new style after setting a new error text. Like this:
passwordInputLayout.error = "Password strength"
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
After switching the order of this two methods the text and underline color changes as expected.
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)
passwordInputLayout.error = "Password strength"
And the error text appearance style looks something like this:
<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
<item name="android:textColor">@color/purple</item>
</style>
Depending on need, one can change/set TextInputLayout text color dynamically or directly in the layout XML file. Below is sample code snippets
Create a custom style which uses @android:style/TextAppearance as parent in your styles.xml file:
<style name="style_error_appearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/color_error</item>
<item name="android:textSize">11sp</item>
</style>
And, use it in your TextInputLayout widget:
- Directly in XML Layout
<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">
- Dynamically in your class
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);
If you want to set single/same error text color for your application then define the text color in your app theme
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Error text color... -->
<item name="textColorError">@color/color_error</item>
<!-- other styles... -->
</style>
And in your AndroidManifest.xml:
<application
android:theme="@style/AppTheme"
android:icon="@drawable/ic_launcher"
android:label="@string/your_app_name">
<!-- ... -->
</application>
I looked into the TextInputLayout source and I realised that error text color is gotten from colors.xml. Just add this to your colors.xml:
<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>