如何设置TextInputLayout错误消息颜色?


90

如何更改可以设置为显示在文本字段下方的错误消息的颜色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 /结果:

当出现错误消息时,字段上方的提示将更改为与错误消息相同的颜色,从而覆盖提示颜色–这是设计使然。



错误颜色将替换处于错误状态的提示颜色。这是设计使然。请参阅google.com/design/spec/components/…。如果不更改TextInputLayout类,就无法解决此问题。
Eugen Pechanec

@EugenPechanec我没意识到是这种情况。感谢您的解释
勒布Jachec

1
@EugenPechanec我很确定你在这里错了。您要指的部分来自字符计数器。对于一般的字段中的错误应该是这样的图像上(注意,提示不着色)material-design.storage.googleapis.com/publish/material_v_4/...
的Arkadiusz“苍蝇” Rzadkowolski

2
@EugenPechanec code.google.com/p/android/issues/detail?id=195775-这确实是错误,将在以后的版本中修复:)
Arkadiusz'fly'Rzadkowolski

Answers:


140

创建一个自定义样式,@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(里面的提示EditTextTextView等等)持有不同颜色的提示和错误。


1
谢谢。看起来直截了当,但却无法以某种方式找到我的生命!
Seb Jachec

2
更新:是否可以仅更改错误消息的样式?这似乎也改变了字段上方的提示样式。
Seb Jachec 2015年

真?不适合我,看看上面的图片。确定要将样式分配给app:errorTextAppearance
dabo248

1
@EugenPechanec简化后的样子是这样的:<android.support.design.widget.TextInputLayout app:errorTextAppearance="@style/error_appearance"><AutoCompleteTextView android:hint="@string/prompt_email"/></android.support.design.widget.TextInputLayout>。是的,这是另一个TextView,这就是为什么它不采用TextInputLayout中的错误颜色的原因。
dabo248

7
如果您只想更改颜色,则最好将样式设置parentparent="TextAppearance.Design.Error"。这样,它保留了默认的文本大小和任何其他属性,但是让我们专门自定义错误颜色,这是当前问题的目标。
w3bshark '16

28

其实,要改变只是错误消息的颜色,你可以设置textColorError你的主题(也设置colorControlNormal以及colorControlActivated为广大小部件和提示文本颜色)。TextInputLayout选择该属性。注意:如果您设置errorTextAppearance为自定义样式,则将textColorError无效。

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

17
确实应该有人写一本关于主题和样式以及所有可能的属性的书。这真是太疯狂了,您可以通过多种方式设置颜色和样式,而没有办法知道哪种方式是正确的。当然,当然没有任何文档:(我是说有文档,但这确实令人困惑
。– aleksamarkoni

这比得分更高的答案好得多!
philthomas18年

6
对我来说,此解决方案导致了一个错误(textColorError未找到),但是我设法colorError在主题中设置了属性。似乎每个版本的Android / Support Library都有自己的主题属性。
斯拉夫

9
我收到“ Android资源链接失败”的消息,但<item name="colorError">@color/error</item>工作正常
m4n3k4s

4
请更新帖子。textColorError现在为colorError。
马特·沃尔夫,

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>

您的R.style.InputError_Purple是什么样的?
toobsco42

@ toobsco42样式仅定义文本颜色。我已经用实际的实现编辑了答案。
伊万·马里奇(IvanMarić)

谢谢!我将这个视图用于有效的文本和错误的文本(绿色和红色),并且未正确更改下划线的颜色使我发疯。
rexar5

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)然后才能调用上述方法。


错误文本的颜色发生变化,但下划线颜色仍然保留它仅在下一次调用相同功能时发生变化
Mohammad Shabaz Moosa

@ Dr.aNdRO这使用反射,不能保证总是工作!
ucMedia '19


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

错误文本的颜色发生变化,但下划线颜色仍然保留它仅在下一次调用相同功能时发生变化
Mohammad Shabaz Moosa

2
不要使用这个。到目前为止,这还不可靠
Dr. aNdRO's

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>

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>

-2

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

<color name="design_textinput_error_color_light" tools:override="true">your hex color</color>

为我工作并添加了设计库。
Java Geek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.