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

Val*_*ran 4 android material-design android-textinputlayout material-components material-components-android

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

例如:

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

<style name="Theme.MyTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
                                .
                                .
                                .
    <item name="textInputStyle">@style/MyTextInputLayoutStyle</item>
</style>
Run Code Online (Sandbox Code Playgroud)

我希望TextInputEditText有类似的方式,例如:

<item name="editTextStyle">@style/MyTextInputEditTextStyle</item>
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

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

Gab*_*tti 5

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

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

就像是:

  <style name="MyCustomOutlined" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
    <item name="materialThemeOverlay">@style/MyThemeOverlayOutlined</item>    
  </style>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以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>
Run Code Online (Sandbox Code Playgroud)

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

    <com.google.android.material.textfield.TextInputLayout
        style="@style/MyCustomOutlined"
        .../>
Run Code Online (Sandbox Code Playgroud)

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

<style name="AppTheme" parent="Theme.MaterialComponents.Light">
   ....
   <item name="textInputStyle">@style/MyCustomOutlined</item>
</style>
Run Code Online (Sandbox Code Playgroud)