新 com.google.android.material.textfield.TextInputEditText 的全局样式

Global style for new 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>

但它不起作用。

Here 与 post 类似,但仅适用于旧设计支持组件。

根据此评论,editTextStyle 是要设置的正确属性。 https://github.com/material-components/material-components-android/blob/6c70169e8d4ae77429a9c57785e443b2a18b4aa3/lib/java/com/google/android/material/theme/res/values/attrs.xml#L85

查看这些样式的示例用法: https://github.com/material-components/material-components-android/blob/6c70169e8d4ae77429a9c57785e443b2a18b4aa3/lib/java/com/google/android/material/textfield/res/values/styles.xml#L141

更新: 请在自定义 TextInputLayoutStyle 中设置 @style/ThemeOverlay.MaterialComponents.TextInputEditText。

TextInputLayout 使用 materialThemeOverlay 属性覆盖 editTextStyle 属性。

例如 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 定义一个样式,扩展 material themes.
然后你必须使用新的 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>