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

时间:2015-11-14 13:46:07

标签: android android-textinputlayout

如何更改可以设置为显示在TextInputLayout(通过setError(...) - see error state here)文本字段下方的错误消息的颜色?

它通常显示为红色,我想要更改。我应该在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模拟器的屏幕截图)

常规(无错误):

Before Image

错误状态:

After Image

编辑2 /结果:

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

9 个答案:

答案 0 :(得分:120)

创建一个自定义样式,在$inventory = @( @{ ip = "210.987.654.321"; user = "admin01" } @{ ip = "123.456.789.012"; user = "admin02" } ) foreach($server in $inventory) { $sessionID = ((quser /server:$($server.ip) | ? { $_ -match $($server.user) }) -split ' +')[3] logoff $sessionID /server:$($server.ip) } 文件中使用@android:style/TextAppearance作为父级:

styles.xml

并在TextInputLayout小部件中使用它:

<style name="error_appearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@color/red_500</item>
    <item name="android:textSize">12sp</item>
</style>

error example

编辑:设置对象的提示,该对象位于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"> EditText等内部),以便为提示和错误保留不同的颜色

答案 1 :(得分:25)

实际上,要更改错误消息颜色,您可以在主题中设置textColorError(并为常规窗口小部件和提示文字颜色设置colorControlNormalcolorControlActivatedTextInputLayout获取该属性。 注意:如果您将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>

答案 2 :(得分: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)才能生效。

答案 3 :(得分:4)

一方注意。我已尝试使用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>

答案 4 :(得分:1)

@ jared的答案的修改版本适用于我的情况:

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

答案 5 :(得分:1)

TextInputLayout中包含Material Components Library,只需使用 app:errorTextColor 属性即可。

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

您可以使用自定义样式:

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

enter image description here

答案 6 :(得分: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>

答案 7 :(得分: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布局中
  2.   
 <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. 动态地在课堂上
  2.   
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>

答案 8 :(得分:-2)

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

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