android - 如何在不重复的情况下更改 MaterialButton 的样式?

标签 android material-design android-styles material-components material-components-android

我们正在使用 Material Components 1.0.0,并希望在整个应用程序中更改 MaterialButton 的样式。我们创建了自己的样式,扩展了组件库中的样式。现在我们有类似的东西:

<resources>
    <style name="MyApp.Button" parent="Widget.MaterialComponents.Button">
        <item name="android:minHeight">@dimen/action_button_min_height</item>
        <item name="android:minWidth">@dimen/action_button_min_width</item>
        <item name="android:fontFamily">@fonts/customFont</item>
        <item name="android:singleLine">true</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:paddingLeft">8dp</item>
        <item name="android:paddingRight">8dp</item>
        <item name="android:insetTop">0dp</item>
        <item name="android:insetBottom">0dp</item>
    </style>

    <style name="MyApp.Button.Unelevated" parent="Widget.MaterialComponents.Button.UnelevatedButton">
        <item name="android:minHeight">@dimen/action_button_min_height</item>
        <item name="android:minWidth">@dimen/action_button_min_width</item>
        <item name="android:fontFamily">@fonts/customFont</item>
        <item name="android:singleLine">true</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:paddingLeft">8dp</item>
        <item name="android:paddingRight">8dp</item>
        <item name="android:insetTop">0dp</item>
        <item name="android:insetBottom">0dp</item>
    </style>

    <style name="MyApp.Button.Text" parent="Widget.MaterialComponents.Button.TextButton">
        <item name="android:minHeight">@dimen/action_button_min_height</item>
        <item name="android:minWidth">@dimen/action_button_min_width</item>
        <item name="android:fontFamily">@fonts/customFont</item>
        <item name="android:singleLine">true</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:paddingLeft">8dp</item>
        <item name="android:paddingRight">8dp</item>
        <item name="android:insetTop">0dp</item>
        <item name="android:insetBottom">0dp</item>
    </style>

    <style name="MyApp.Button.Outlined" parent="Widget.MaterialComponents.Button.OutlinedButton">
        <item name="android:minHeight">@dimen/action_button_min_height</item>
        <item name="android:minWidth">@dimen/action_button_min_width</item>
        <item name="android:fontFamily">@fonts/customFont</item>
        <item name="android:singleLine">true</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:paddingLeft">8dp</item>
        <item name="android:paddingRight">8dp</item>
        <item name="android:insetTop">0dp</item>
        <item name="android:insetBottom">0dp</item>
    </style>
</resources>

有没有办法避免为每种样式定义相同的值?

最佳答案

由于您使用不同的父级样式,您只能简化部分属性,而不是全部。

例如你可以定义:

<style name="MyButtonTextAppearance" parent="@style/TextAppearance.MaterialComponents.Button>
    <item name="fontFamily">.....</item>
    <item name="android:fontFamily">...</item>
    <item name="android:textStyle">...</item>
    <item name="android:textAllCaps">...</item>
    <item name="android:textSize">...</item>
    <item name="android:letterSpacing">...</item>
</style>

在您的样式中,您可以使用以下方法删除相同的属性:

<style name="MyApp.Button" parent="Widget.MaterialComponents.Button">
   ....
   <item name="android:textAppearance">@style/MyButtonTextAppearance</item>
</style>

关于android - 如何在不重复的情况下更改 MaterialButton 的样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58025007/

相关文章:

android - 生成带混淆的签名 apk 时应用程序崩溃 (NoSuchMethodError)

android - 没有这样的文件或目录,无法构建Android项目

Angular Material2 md-select 下拉菜单出现在页面底部

android - 我无法获得可样式化的属性数组

android - Android textview 中的 Html Styling 出错

java - 如何使用 header "Range"分段发送文件?

android - 是否可以从 Realm 迁移到 Sqlite?

带有扩展工具栏的 Android Material

android - 将 Theme.Material.Light.DarkActionBar 与 Theme.AppCompat.Light.DarkActionBar 一起使用会使 android L(api v21) 上的应用程序崩溃

android - 样式化 ChromeCast MediaRoute 按钮