We are using material components 1.0.0 and wanted to alter the style of MaterialButton across the app. We created our own styles extending the ones from components library. Right now we have something like:
<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>
Is there a way to avoid defining same values for every style?
Since you are using different parent styles you can only semplify some attributes, but not all.
For example you can define:
<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>
And in your styles you can remove the same attributes using:
<style name="MyApp.Button" parent="Widget.MaterialComponents.Button">
....
<item name="android:textAppearance">@style/MyButtonTextAppearance</item>
</style>