自定义TextInputLayout失焦后提示语无法维持红色的问题求助
解决TextInputLayout错误状态下失去焦点后提示语变灰的问题
这个问题的核心是:TextInputLayout在错误状态下失去焦点时,会默认回退到非聚焦状态的hint颜色,你之前手动切换hintTextAppearance的方式无法持久锁定错误状态的颜色。我们可以通过**颜色状态列表(ColorStateList)**让hint颜色根据控件状态自动适配,确保错误状态下无论是否聚焦都保持红色。
步骤1:创建hint颜色状态列表
在res/color目录下新建hint_color.xml文件,定义不同状态对应的hint颜色:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 错误状态:无论是否聚焦,hint都显示红色 --> <item android:color="@color/red" android:state_error="true"/> <!-- 聚焦状态:hint显示主题色 --> <item android:color="@color/colorPrimary" android:state_focused="true"/> <!-- 默认状态:hint显示黑色 --> <item android:color="@color/black"/> </selector>
步骤2:修改TextInputLayout的布局配置
打开custom_text_input.xml,给TextInputLayout添加hintTextColor属性,关联我们刚创建的颜色状态列表:
<android.support.design.widget.TextInputLayout android:id="@+id/label" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:paddingTop="16dp" app:errorTextAppearance="@style/ErrorMessage" app:hintTextAppearance="@style/Hint" app:hintTextColor="@color/hint_color"> <!-- 新增这行配置 --> <android.support.v7.widget.AppCompatEditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="8dp" android:paddingTop="8dp"/> </android.support.design.widget.TextInputLayout>
步骤3:简化CustomTextInput的错误处理逻辑
你之前手动切换hintTextAppearance的操作可以移除了,颜色状态列表会自动根据错误状态调整颜色。修改后的方法如下:
public void showErrorMessage() { textInputLayout.setErrorEnabled(true); textInputLayout.setError(errorMessage); } public void hideErrorMessage() { textInputLayout.setError(null); textInputLayout.setErrorEnabled(false); }
方案原理说明
TextInputLayout内置了state_error状态,当你调用setErrorEnabled(true)和setError()时,这个状态会被激活。我们定义的颜色状态列表会优先匹配该状态,因此只要错误未被清除,无论控件是否获得焦点,hint都会保持红色。
另外,你已配置的ErrorMessage样式会负责显示下方的错误提示文字颜色,无需额外修改。
内容的提问来源于stack exchange,提问作者buellas
相关产品推荐
相关产品推荐

