【问题标题】:Global style for new com.google.android.material.textfield.TextInputEditText新 com.google.android.material.textfield.TextInputEditText 的全局样式
【发布时间】:2019-05-27 08:24:00
【问题描述】:

是否可以在不为每个组件额外设置的情况下为新的 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 是类似的帖子,但仅针对旧的设计支持组件。

【问题讨论】:

    标签: android material-design android-textinputlayout material-components-android material-components


    【解决方案1】:

    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>
    

    【讨论】:

    • @StayCool 我更新了答案,试图解释为什么你不能在应用主题中使用editTextStyle。您可以使用textInputStyle 全局定义样式。
    • 现在,当我找到解决方案时,我认为您的答案是正确的。
    【解决方案2】:

    【讨论】:

    • 您可以尝试在 MyTextInputLayoutStyle 中设置 materialThemeOverlay 吗?
    • 在我的自定义 TextInputLayoutStyle 中设置 &lt;item name="materialThemeOverlay"&gt;@style/ThemeOverlay.MaterialComponents.TextInputEditText&lt;/item&gt; 对我有用。谢谢!更新你的答案,然后我会批准它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2019-07-14
    相关资源
    最近更新 更多