Android |使用 styles.xml 更改 TextInputLayout 的主题

Android | Change theme of TextInputLayout using styles.xml

我想在一个主题中将自定义样式应用到 TextInputLayout's hinterror 并全局应用它,即在 styles.xml 中定义它并以某种方式将它应用到所有TextInputLayouts 在整个应用程序中使用,无需像这样 inline 添加它:

<android.support.design.widget.TextInputLayout
    android:id="@+id/usernameWrapper"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/email_username"
    android:textColorHint="@color/grey_text"
    app:theme="@style/my_custom_style">

<style name="my_custom_style" parent="Widget.Design.TextInputLayout">
    <item name="android:textColorHint">@color/success_accent</item>
    <item name="android:textSize">20sp</item>
</style>

我们可以像这样做 Button 小部件:

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="buttonStyle">@style/my.Widget.Button</item>
    <item name="android:buttonStyle">@style/my.Widget.Button</item>
</style>

<style name="my.Widget.Button" parent="@android:style/Widget.TextView">
    <item name="android:gravity">center</item>
    <item name="android:textSize">@dimen/some_dimen</item>
    <item name="android:textAllCaps">false</item>
</style>

注意:我目前正在考虑 子类化 TextInputLayout 作为最后的手段,所以,请记住这一点当你回答时。

谢谢:)

Just thinking out loud here, did you try this? This should change the color hint all over your app, but if you are want this anyways this just might help with your case.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textColorHint">@style/text_hint_appearance</item>
</style>

<style name="text_hint_appearance" parent="@android:style/TextAppearance">
    <item name="android:textColorHint">@color/success_accent</item>
</style>

不幸的是,TextInputLayout 小部件,似乎设计支持库中的所有小部件,都没有为其默认样式定义全局主题属性。因此,不可能全局自定义它的样式,除非将其子类化以支持自定义主题属性以从中查询默认样式,然后在所有地方使用子类。

请注意,Widget.Design.TextInputLayout 样式仍将被硬编码为默认样式,如果小部件找不到在其主题中定义的属性,它将回退到该默认样式,因此这与默认情况下的现有实现。

设计支持库开发人员似乎存在一种误解,即定义默认主题属性需要它出现在当前主题中才能正常工作。此问题之前 reported TabLayout,但基于此推理已关闭,后续的查询和澄清没有产生进一步的响应。随时在 AOSP 问题跟踪器上打开另一张票,并进行必要的说明;希望它会更好。

我正在用这个

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    [...]// other definitions
    <item name="editTextStyle">@style/EditTextDefault</item>
</style>


 <style name="Widget.Design.TextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense">
     <item name="hintTextAppearance">@style/AppTheme.TextFloatLabelAppearance</item>
     <item name="errorTextAppearance">@style/AppTheme.TextErrorAppearance</item>
 </style>

<style name="AppTheme.TextFloatLabelAppearance" parent="TextAppearance.Design.Hint">
     <item name="android:textColor">@color/colorAccent</item>
 </style>

 <style name="AppTheme.TextErrorAppearance" parent="TextAppearance.Design.Error">
     <item name="android:textColor">#d32f2f</item>
 </style>

<style name="EditTextDefault" parent="android:Widget.EditText">
    <item name="android:paddingLeft">10dp</item>
</style>

我在项目中使用的解决方案:

<style name="AppBaseTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="textInputStyle">@style/TextInputLayoutTheme</item>
  </style>
<style name="TextInputLayoutTheme" parent="Widget.Design.TextInputLayout">
    <item name="colorOnSurface">@android:color/transparent</item>
</style>