¿Cómo establecer el color del mensaje de error TextInputLayout?

¿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(...) – vea el estado de 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 orientar el color?

Gracias por adelantado.

Editar:

app:errorTextAppearance agregada app:errorTextAppearance clave app:errorTextAppearance para mi TextInputLayout :

     

y el aspecto del error (configurado en verde para la prueba) :

  @android:color/holo_green_dark  

El resultado es que tanto la pista como el mensaje de error están coloreados (capturas de pantalla de Android Emulator escalado) :

Regular (sin error):

Antes de la imagen

Estado de error:

Después de la imagen

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.

    Cree un estilo personalizado que use @android:style/TextAppearance como elemento principal en su archivo styles.xml :

      

    Y úsala en tu widget TextInputLayout:

       

    ejemplo de error

    Editar: establezca la sugerencia en el objeto, que está dentro de su TextInputLayout ( EditText , TextView , etc.) para mantener diferentes colores para la sugerencia y el error.

    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 sugerencia). TextInputLayout recoge ese atributo. NOTA: si configura errorTextAppearance en un estilo personalizado, textColorError no tendrá efecto.

      

    Y en su AndroidManifest.xml:

        

    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 a textInputLayout.setErrorEnabled(true) antes de invocar el método anterior para que esto funcione.

    Una versión modificada de @ jared’s Answer 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(); } } 

    Una nota lateral. He intentado la solución aceptada con errorTextAppereance . Funciona muy bien, pero al principio, el color de subrayado de la 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 según lo esperado.

     passwordInputLayout.setErrorTextAppearance(R.style.InputError_Purple) passwordInputLayout.error = "Password strength" 

    Y el estilo de apariencia del texto de error se ve así:

       

    Revisé el origen de TextInputLayout y me di cuenta de que el color del texto de error se obtiene de colors.xml. Solo agrega esto a tus colors.xml:

     your hex color