1560501234327.png
在使用 TextInputLayout 编写一个登录界面时,发现一个深坑,记录下来。
简单的布局文件如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="50dp"
android:layout_marginStart="50dp"
android:layout_marginTop="20dp">
<EditText android:id="@+id/etMail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/mail"
android:imeOptions="actionNext"
android:inputType="textEmailAddress"
android:lines="1"
android:singleLine="true"
android:textColor="@android:color/white"
android:textSize="14sp" />
</android.support.design.widget.TextInputLayout>

然而,此时 TextInputLayout 的未激活状态下hint的文字颜色为黑色,无法调整,查找资料得知,需要在style里添加一个theme,并复写textColorHint属性,如下

1
2
3
4
5
6
7
8
9
<style name="TextLabel" parent="TextAppearance.AppCompat">
<!-- Hint color and label color in FALSE state -->
<item name="android:textColorHint">@color/Color Name</item>
<item name="android:textSize">20sp</item>
<!-- Label color in TRUE state and bar color FALSE and TRUE State -->
<item name="colorAccent">@color/Color Name</item>
<item name="colorControlNormal">@color/Color Name</item>
<item name="colorControlActivated">@color/Color Name</item>
</style>

然后将该theme添加到TextInputLayout中,然而我这样做之后,颜色样式确实改变了,但是在尝试添加error提示的时候崩溃了,
报错java.lang.UnsupportedOperationException: Failed to resolve attribute at index 4: TypedValue{t=0x2/d=0x1010099 a=1}
Google一番找到的解决方案对我无效。
猜测是Android Design库升级之后部分行为发生了变更。
尝试更换TextLabel Theme 的 parent 主题为Material包下的主题,失败。
搜索之后,发现正确应该继承Widget.Design.TextInputLayout。之后一切表现正常
完整Theme主题如下:

1
2
3
4
5
6
7
<style name="TextLabel" parent="Widget.Design.TextInputLayout" >
<item name="android:textColorHint">@color/colorWhite5</item>
<item name="android:textSize">14sp</item>
<item name="colorAccent">@color/colorRedAccept</item>
<item name="android:colorControlNormal">@color/colorWhite3</item>
<item name="android:colorControlActivated">@color/colorRedText</item>
</style>