首页 > 解决方案 > 新 com.google.android.material.textfield.TextInputEditText 的全局样式

问题描述

com.google.android.material.textfield.TextInputEditText是否可以在不为每个组件额外设置的情况下设置新组件的样式?

例如:

对于新的TextInputLayout,我可以通过以下方式全局设置样式:

<style name="Theme.MyTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
                                .
                                .
                                .
    <item name="textInputStyle">@style/MyTextInputLayoutStyle</item>
</style>

我期望TextInputEditText采用类似的方式,例如:

<item name="editTextStyle">@style/MyTextInputEditTextStyle</item>

但它不起作用。

是一个类似的帖子,但仅适用于旧的设计支持组件。

标签: androidmaterial-designandroid-textinputlayoutmaterial-components-androidmaterial-components

解决方案


使用属性TextInputLayout覆盖editTextStyle属性materialThemeOverlay

例如,Widget.MaterialComponents.TextInputLayout.FilledBox具有此默认样式:

<style name="Widget.MaterialComponents.TextInputLayout.FilledBox" parent="Base.Widget.MaterialComponents.TextInputLayout">
    <item name="materialThemeOverlay">
       @style/ThemeOverlay.MaterialComponents.TextInputEditText.FilledBox
    </item>
    ....
</style>
<style name="ThemeOverlay.MaterialComponents.TextInputEditText.FilledBox">
    <item name="editTextStyle">@style/Widget.MaterialComponents.TextInputEditText.FilledBox</item>
</style>

要全局定义,您必须为TextInputLayout扩展其中一个材料主题定义一种样式。
然后你必须使用新materialThemeOverlay属性。它允许您覆盖应用程序主题属性,并且您可以更改该editTextStyle属性。

就像是:

  <style name="MyCustomOutlined" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="materialThemeOverlay">@style/MyThemeOverlayOutlined</item>    
  </style>

通过这种方式,您可以仅更改editTextStyle此组件样式的(应用程序主题属性)。

  <style name="MyThemeOverlayOutlined">
    <item name="editTextStyle">@style/MyTextInputEditText_outlinedBox</item>
  </style>

  <style name="MyTextInputEditText_outlinedBox" parent="@style/Widget.MaterialComponents.TextInputEditText.OutlinedBox">
    <item name="android:paddingTop">8dp</item>
    <item name="android:paddingBottom">8dp</item>
    ....
  </style>

最后,您可以将 分配给布局中MyCustomOutlined特定: TextInputLayout

    <com.google.android.material.textfield.TextInputLayout
        style="@style/MyCustomOutlined"
        .../>

或使用以下方法在您的应用主题中全局分配:

<style name="AppTheme" parent="Theme.MaterialComponents.Light">
   ....
   <item name="textInputStyle">@style/MyCustomOutlined</item>
</style>

推荐阅读