¿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.xml
archivo para seleccionar el color?
Gracias por adelantado.
Editar:
Añadida app:errorTextAppearance
clave 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/TextAppearance
como padre en sustyles.xml
archivo:<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.parent
enparent="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
textColorError
su tema (y también establecercolorControlNormal
ycolorControlActivated
para el widget general y el color del texto de la sugerencia).TextInputLayout
recoge ese atributo. NOTA: si estableceerrorTextAppearance
un estilo personalizado,textColorError
no 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
textColorError
no encontrado), pero logré establecer uncolorError
atributo 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 nuevoerrorTextAppereance
estilo. 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
TextInputLayout
incluido en la Biblioteca de componentes de materiales, simplemente use elapp:errorTextColor
atributo.<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