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

Mia*_*LiD 4 xml android android-styles android-textinputlayout

我想在一个主题中应用自定义样式TextInputLayout's hint并将error其全局应用,即在styles.xml中定义它,并以某种方式将其TextInputLayouts应用于整个应用程序中使用的所有内容,而无需像这样添加内联:

<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>
Run Code Online (Sandbox Code Playgroud)

我们可以像这样做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>
Run Code Online (Sandbox Code Playgroud)

注意:我目前正在考虑将子类化TextInputLayout作为最后的手段,因此,请在回答时牢记这一点.

谢谢 :)

P. *_*ohm 12

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

<style name="AppBaseTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="textInputStyle">@style/TextInputLayoutTheme</item>
  </style>
Run Code Online (Sandbox Code Playgroud)
<style name="TextInputLayoutTheme" parent="Widget.Design.TextInputLayout">
    <item name="colorOnSurface">@android:color/transparent</item>
</style>
Run Code Online (Sandbox Code Playgroud)


cor*_*992 10

不幸的是,TextInputLayout小部件,以及设计支持库中的所有小部件,都没有为它的默认样式定义全局主题属性.因此,除了通过对其进行子类化以支持自定义主题属性以查询默认样式以及在任何地方使用子类之外,不可能在全局范围内自定义它的样式.

请注意,如果Widget.Design.TextInputLayout样式无法找到其主题中定义的属性,则样式仍将硬编码为窗口小部件将返回的默认样式,因此这与默认情况下的现有实现没有区别.

设计支持库开发人员似乎存在一种误解,即定义默认主题属性要求它出现在当前主题中才能正常工作.此问题之前已报告TabLayout,但基于此推理已结束,随后的查询和澄清未产生进一步的响应.随意在AOS​​P问题跟踪器上打开另一张票,并进行必要的澄清; 希望它可能会更好.