如何不重复地更改MaterialButton的样式?

时间:2019-09-20 08:52:17

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

我们正在使用材质组件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>

有没有一种方法可以避免为每种样式定义相同的值?

1 个答案:

答案 0 :(得分:0)

由于使用的是不同的父样式,因此只能简化某些属性,而不能简化所有属性。

例如,您可以定义:

<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>