android - ¿Cómo configurar el color del mensaje de error TextInputLayout?
android-textinputlayout (8)
Cree un estilo personalizado que use
@android:style/TextAppearance
como padre en su archivo
styles.xml
:
<style name="error_appearance" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/red_500</item>
<item name="android:textSize">12sp</item>
</style>
Y úselo 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:
establezca la sugerencia sobre el objeto, que está dentro de su TextInputLayout (
EditText
,
TextView
, etc.) para contener diferentes colores para la sugerencia y el error.
¿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
(a través de
setError(...)
-
ver el estado del error aquí
)?
Normalmente se muestra como un color rojo, que quiero cambiar.
¿Qué nombres / claves de elementos debo usar en mi archivo
styles.xml
para seleccionar el color?
Gracias por adelantado.
Editar:
app:errorTextAppearance
agregada
app:errorTextAppearance
clave de
app:errorTextAppearance
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 aparición 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 la pista y el mensaje de error están coloreados (capturas de pantalla del emulador de Android escalado) :
Regular (sin error):
Estado de error:
Edición 2 / Resultado:
Cuando aparece el mensaje de error, la pista sobre el campo cambia al mismo color que el mensaje de error, anulando el color de la pista, esto es por diseño.
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 úselo en su widget TextInputLayout:
- Directamente en diseño 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">
- Dinámicamente en tu clase
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);
Si desea establecer un color de texto de error único / mismo 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 tu AndroidManifest.xml:
<application
android:theme="@style/AppTheme"
android:icon="@drawable/ic_launcher"
android:label="@string/your_app_name">
<!-- ... -->
</application>
En realidad, para cambiar solo el color del mensaje de error, puede establecer
textColorError
en su tema (y también establecer
colorControlNormal
y
colorControlActivated
para el widget general y el color del texto de la pista).
TextInputLayout
recoge ese atributo.
NOTA:
si establece
errorTextAppearance
en 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 tu AndroidManifest.xml:
<application
android:theme="@style/AppTheme"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<!-- ... -->
</application>
Miré en la fuente 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>
Necesitaba hacer esto dinámicamente. 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 a
textInputLayout.setErrorEnabled(true)
antes de invocar el método anterior para que esto funcione.
Si está utilizando com.google.android.material.textfield.TextInputLayout este diseño de entrada, entonces simplemente establece 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>
Una nota al margen.
He intentado la solución aceptada con
errorTextAppereance
.
Funciona realmente bien, pero al principio, el color de subrayado de entrada no cambiaba después de aplicar un nuevo estilo
errorTextAppereance
.
Veo que hay algunos comentarios y que otras personas están experimentando el mismo problema.
En mi caso, esto estaba sucediendo 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 de 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 ve así:
<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
<item name="android:textColor">@color/purple</item>
</style>
ACTUALIZAR
Utilice una vista personalizada en su lugar y no esto
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();
}
}