¿Cómo puedo cambiar el color del mensaje de error que se puede configurar para que aparezca debajo del campo de texto en un TextInputLayout(vía setError(...)- ver estado de error aquí )?
Normalmente se muestra como un color rojo, que quiero cambiar. ¿Qué nombres / claves de elementos debo usar en mi styles.xmlarchivo para seleccionar el color?
Gracias por adelantado.
Editar:
Añadida app:errorTextAppearanceclave a mi 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>
y la apariencia del error (establecido en verde para la prueba) :
<style name="WelcomeErrorAppearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@android:color/holo_green_dark</item>
</style>
El resultado es que tanto la sugerencia como el mensaje de error están coloreados (capturas de pantalla del emulador de Android escalado) :
Regular (sin error):
Estado de error:
Editar 2 / Resultado:
Cuando aparece el mensaje de error, la sugerencia sobre el campo cambia al mismo color que el mensaje de error, anulando el color de la sugerencia, esto es por diseño.
fuente



Respuestas:
Cree un estilo personalizado que se utilice
@android:style/TextAppearancecomo padre en sustyles.xmlarchivo:<style name="error_appearance" parent="@android:style/TextAppearance"> <item name="android:textColor">@color/red_500</item> <item name="android:textSize">12sp</item> </style>Y utilícelo en su 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">Editar: Establecer la pista sobre el objeto, que está dentro de su TextInputLayout (
EditText,TextView, etc.) para mantener diferentes colores por la pista y el error.fuente
app:errorTextAppearance?<android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>. Así que sí, es otro TextView, por eso no toma el color de error del TextInputLayout.parentenparent="TextAppearance.Design.Error". De esa manera, conserva el tamaño de texto predeterminado y cualquier otro atributo, pero le permite personalizar específicamente el color de error, que era el objetivo de la pregunta en cuestión.En realidad, para cambiar solo el color del mensaje de error, puede establecer
textColorErrorsu tema (y también establecercolorControlNormalycolorControlActivatedpara el widget general y el color del texto de la sugerencia).TextInputLayoutrecoge ese atributo. NOTA: si estableceerrorTextAppearanceun estilo personalizado,textColorErrorno tendrá ningún efecto.<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>Y en su AndroidManifest.xml:
<application android:theme="@style/AppTheme" android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <!-- ... --> </application>fuente
textColorErrorno encontrado), pero logré establecer uncolorErroratributo en mi tema. Parece que cada versión de Android / Support Library tiene sus propios atributos de tema.<item name="colorError">@color/error</item>Una nota al margen. He probado la solución aceptada con
errorTextAppereance. Funciona muy bien, pero al principio, el color del subrayado de entrada no cambiaba después de aplicar un nuevoerrorTextAppereanceestilo. Veo que hay algunos comentarios y que otras personas están experimentando el mismo problema.En mi caso, esto sucedía cuando estaba configurando un nuevo estilo después de configurar un nuevo texto de error. Me gusta esto:
passwordInputLayout.error = "Password strength" passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple)Después de cambiar el orden de estos dos métodos, el texto y el color del subrayado cambian como se esperaba.
passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple) passwordInputLayout.error = "Password strength"Y el estilo de apariencia del texto de error se parece a esto:
<style name="InputError" parent="TextAppearance.Design.Error"/> <style name="InputError.Purple"> <item name="android:textColor">@color/purple</item> </style>fuente
Necesitaba hacer esto de forma dinámica. Usando la reflexión:
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(); } }Deberá llamar
textInputLayout.setErrorEnabled(true)antes de invocar el método anterior para que esto funcione.fuente
Con lo
TextInputLayoutincluido en la Biblioteca de componentes de materiales, simplemente use elapp:errorTextColoratributo.<com.google.android.material.textfield.TextInputLayout app:errorTextColor="@color/...." .../>En un estilo personalizado puedes usar:
<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" > <item name="errorTextColor">@color/...</item> ... </style>fuente
ACTUALIZAR
Una versión modificada de la respuesta de @ jared que funciona en mi caso:
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(); } }fuente
Si está utilizando com.google.android.material.textfield.TextInputLayout este diseño de entrada, simplemente establezca un estilo
<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>fuente
Dependiendo de la necesidad, se puede cambiar / establecer el color del texto TextInputLayout de forma dinámica o directamente en el archivo XML de diseño. A continuación se muestran fragmentos de código de muestra
Cree un estilo personalizado que use @android: style / TextAppearance como padre en su archivo 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>Y utilícelo en su 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 desea establecer el mismo color de texto de error para su aplicación, defina el color del texto en el tema de su aplicación
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Error text color... --> <item name="textColorError">@color/color_error</item> <!-- other styles... --> </style>Y en su AndroidManifest.xml:
<application android:theme="@style/AppTheme" android:icon="@drawable/ic_launcher" android:label="@string/your_app_name"> <!-- ... --> </application>fuente
Miré la fuente de TextInputLayout y me di cuenta de que el color del texto de error se obtiene de colors.xml. Simplemente agregue esto a su colors.xml:
<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>fuente