android - ¿Cómo configurar el color del mensaje de error TextInputLayout?




android-textinputlayout (6)

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:

  1. 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">
  1. 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>

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.


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();
    }
}






android-textinputlayout