96

如何更改可以设置为显示在 a 中的文本字段下方的错误消息的颜色TextInputLayout(通过setError(...)-请参阅此处的错误状态)?

它通常显示为红色,我想更改它。我应该在我的styles.xml文件中使用哪些项目名称/键来定位颜色?

提前致谢。


编辑:

向我添加app:errorTextAppearance了密钥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>

和错误出现(设置为绿色进行测试)

<style name="WelcomeErrorAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@android:color/holo_green_dark</item>
</style>

结果是提示和错误消息是彩色的(来自缩放的 Android 模拟器的屏幕截图)

常规(无错误):

图像之前

错误状态:

后像

编辑 2/结果:

出现错误消息时,字段上方的提示将变为与错误消息相同的颜色,覆盖提示颜色 - 这是设计使然。

4

9 回答 9

148

创建一个在您的文件@android:style/TextAppearance中用作父级的自定义样式: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>

并在您的 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">

错误示例

编辑:在对象上设置提示,该对象位于您的 TextInputLayout ( EditText,TextView等) 内,以保存提示和错误的不同颜色。

于 2015-11-14T14:21:19.637 回答
28

实际上,要仅更改错误消息的颜色,您可以textColorError在主题中设置(还可以为常规小部件和提示文本颜色设置colorControlNormal和)。拿起那个属性。注意:如果您设置为自定义样式,则将无效。colorControlActivatedTextInputLayouterrorTextAppearancetextColorError

<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>

在您的 AndroidManifest.xml 中:

<application
    android:theme="@style/AppTheme"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">

    <!-- ... -->

</application>
于 2016-05-14T21:14:02.810 回答
7

一个旁注。我已经尝试了接受的解决方案之一errorTextAppereance。它工作得非常好,但起初,输入下划线颜色在应用新errorTextAppereance样式后没有改变。我看到有一些评论,其他人也遇到了同样的问题。

就我而言,这是在设置新错误文本后设置新样式时发生的。像这样:

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

切换这两种方法的顺序后,文本和下划线颜色按预期变化。

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

错误文本外观样式如下所示:

<style name="InputError" parent="TextAppearance.Design.Error"/>
<style name="InputError.Purple">
    <item name="android:textColor">@color/purple</item>
</style>
于 2018-06-04T12:26:02.830 回答
7

TextInputLayout包含在材料组件库中,只需使用该app:errorTextColor属性。

    <com.google.android.material.textfield.TextInputLayout
        app:errorTextColor="@color/...."
        .../>

在自定义样式中,您可以使用:

<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox" >
   <item name="errorTextColor">@color/...</item>
   ...
</style>

在此处输入图像描述

于 2019-10-22T07:12:02.923 回答
6

我需要动态地做到这一点。使用反射:

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

您需要textInputLayout.setErrorEnabled(true)在调用上述方法之前调用它才能工作。

于 2016-01-12T19:52:55.180 回答
1

更新

请改用自定义视图,而不是这个


@jared's Answer 的修改版适用于我的情况:

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();
    }
}
于 2016-01-26T14:10:27.457 回答
0

如果你使用com.google.android.material.textfield.TextInputLayout这个输入布局比你只设置一种样式

<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>
于 2019-05-27T06:17:45.273 回答
0

根据需要,可以动态或直接在布局 XML 文件中更改/设置 TextInputLayout 文本颜色。下面是示例代码片段

在您的styles.xml文件中创建一个使用@android:style/TextAppearance作为父级的自定义样式:

<style name="style_error_appearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@color/color_error</item>
    <item name="android:textSize">11sp</item>
</style>

并且,在您的 TextInputLayout 小部件中使用它:

  1. 直接在 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. 动态地在你的课堂上
your_input_layout.setErrorTextAppearance(R.style.style_error_appearance);

如果您想为您的应用程序设置单一/相同的错误文本颜色,请在您的应用程序主题中定义文本颜色

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Error text color... -->
    <item name="textColorError">@color/color_error</item>
    <!-- other styles... -->
</style>

在您的 AndroidManifest.xml 中:

<application
    android:theme="@style/AppTheme"
    android:icon="@drawable/ic_launcher"
    android:label="@string/your_app_name">

    <!-- ... -->

</application>
于 2019-08-06T06:07:05.547 回答
-2

我查看了 TextInputLayout 源代码,发现错误文本颜色是从 colors.xml 中获取的。只需将其添加到您的 colors.xml 中:

<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>
于 2016-07-01T17:14:18.813 回答