如何自定义AppCompat Material按钮样式?
How to Customize AppCompat Material Button Style?
我正在使用 AppCompat 主题,我想在我的按钮上设置 minHeight 属性:
<style name="Theme.MyTheme" parent="Theme.AppCompat">
<item name="android:buttonStyle">@style/MyButtonStyle</item>
</style>
<style name="MyButtonStyle" parent="...?">
<item name="android:minHeight">60dp</item>
</style>
但是,没有 Widget.AppCompat.Button
样式可以设置为 MyButtonStyle
的父样式。如果我使用 android:Widget.Button
,那么我所有的按钮看起来都像旧的蹩脚风格。我尝试了各种其他 AppCompat 主题,例如 TextAppearance.AppCompat.Button
,但它们不起作用。
遗漏按钮样式的父主题也会导致按钮样式不正确。
如何自定义默认 Theme.AppCompat
buttonStyle
?
为了回答我自己的问题,AppCompat does not in fact support Button
小部件目前出现:
AppCompat provides similar behaviour on earlier versions of Android
for a subset of UI widgets:
- Everything provided by AppCompat’s toolbar (action modes, etc)
- EditText
- Spinner
- CheckBox
- RadioButton
- Switch (use the new android.support.v7.widget.SwitchCompat)
- CheckedTextView
我看到的唯一解决方法是从 Android 源代码重新创建 Material 按钮样式,这项任务超出了我的期望范围。
您可以 Base.MyButtonStyle
在 API 14+(在 res/values-v14/styles.xml
)上扩展 android:Widget.Holo.Button
,在 API 21+ 上扩展 android:Widget.Material.Button
(在res/values-v21/styles.xml
中。此样式会根据设备系统版本而变化。请将您的平台特定修改放在这里。
然后让 MyButtonStyle
扩展 Base.MyButtonStyle
并在此处定义 android:minHeight
(在 res/values/styles.xml
中)。这将适用于所有平台。
然后您的按钮可以使用样式 MyButtonStyle
。
此示例假设您的最低 SDK 为 14。
是的,没有 appcompat-v7 按钮样式(好吧,至少现在还没有)。
编辑
这假设您可以在早于 Lollipop 的平台上使用 Holo 按钮。感觉不显眼,如果你能做到没有涟漪,应该没问题。如果你想要涟漪,我建议你 google 第三方棒棒糖按钮库。
使用 AppCompat +22 自定义按钮样式
在你的 styles.xml
<style name="Button.Tinted" parent="Widget.AppCompat.Button">
<item name="colorButtonNormal">YOUR_TINT_COLOR</item>
<item name="colorControlHighlight">@color/colorAccent</item>
<item name="android:textColor">@android:color/white</item> </style>
在你的 layout.xml
<Button
android:id="@+id/but_next"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/but_continue"
android:theme="@style/Button.Tinted" />
删除 android:
<style name="Theme.MyTheme" parent="Theme.AppCompat">
<item name="buttonStyle">@style/MyButtonStyle</item>
</style>
使用新的 MaterialComponent 可以方便地使用 com.google.android.material.button.MaterialButton
而不是常规的 Button
。
但是为了给它设置样式,在主题中使用了不同的属性
- materialButtonStyle
,使用此父主题 Theme.MaterialComponents.DayNight.NoActionBar
。
那么主题应该是这样的:
<style name="NewAppTheme"
parent="Theme.MaterialComponents.DayNight.NoActionBar">
.......
<-- IMPORTANT if you are using com.google.android.material.button.MaterialButton to style them use this parameter
<item name="materialButtonStyle">@style/ButtonStyle</item>
</style>
并且在 ButtonStyle
中,您可以像这样更改按钮属性:
<style name="ButtonStyle" parent="Widget.MaterialComponents.Button.UnelevatedButton">
<item name="android:minHeight">60dp</item>
</style>
我正在使用 AppCompat 主题,我想在我的按钮上设置 minHeight 属性:
<style name="Theme.MyTheme" parent="Theme.AppCompat">
<item name="android:buttonStyle">@style/MyButtonStyle</item>
</style>
<style name="MyButtonStyle" parent="...?">
<item name="android:minHeight">60dp</item>
</style>
但是,没有 Widget.AppCompat.Button
样式可以设置为 MyButtonStyle
的父样式。如果我使用 android:Widget.Button
,那么我所有的按钮看起来都像旧的蹩脚风格。我尝试了各种其他 AppCompat 主题,例如 TextAppearance.AppCompat.Button
,但它们不起作用。
遗漏按钮样式的父主题也会导致按钮样式不正确。
如何自定义默认 Theme.AppCompat
buttonStyle
?
为了回答我自己的问题,AppCompat does not in fact support Button
小部件目前出现:
AppCompat provides similar behaviour on earlier versions of Android for a subset of UI widgets:
- Everything provided by AppCompat’s toolbar (action modes, etc)
- EditText
- Spinner
- CheckBox
- RadioButton
- Switch (use the new android.support.v7.widget.SwitchCompat)
- CheckedTextView
我看到的唯一解决方法是从 Android 源代码重新创建 Material 按钮样式,这项任务超出了我的期望范围。
您可以 Base.MyButtonStyle
在 API 14+(在 res/values-v14/styles.xml
)上扩展 android:Widget.Holo.Button
,在 API 21+ 上扩展 android:Widget.Material.Button
(在res/values-v21/styles.xml
中。此样式会根据设备系统版本而变化。请将您的平台特定修改放在这里。
然后让 MyButtonStyle
扩展 Base.MyButtonStyle
并在此处定义 android:minHeight
(在 res/values/styles.xml
中)。这将适用于所有平台。
然后您的按钮可以使用样式 MyButtonStyle
。
此示例假设您的最低 SDK 为 14。
是的,没有 appcompat-v7 按钮样式(好吧,至少现在还没有)。
编辑
这假设您可以在早于 Lollipop 的平台上使用 Holo 按钮。感觉不显眼,如果你能做到没有涟漪,应该没问题。如果你想要涟漪,我建议你 google 第三方棒棒糖按钮库。
使用 AppCompat +22 自定义按钮样式 在你的 styles.xml
<style name="Button.Tinted" parent="Widget.AppCompat.Button">
<item name="colorButtonNormal">YOUR_TINT_COLOR</item>
<item name="colorControlHighlight">@color/colorAccent</item>
<item name="android:textColor">@android:color/white</item> </style>
在你的 layout.xml
<Button
android:id="@+id/but_next"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/but_continue"
android:theme="@style/Button.Tinted" />
删除 android:
<style name="Theme.MyTheme" parent="Theme.AppCompat">
<item name="buttonStyle">@style/MyButtonStyle</item>
</style>
使用新的 MaterialComponent 可以方便地使用 com.google.android.material.button.MaterialButton
而不是常规的 Button
。
但是为了给它设置样式,在主题中使用了不同的属性
- materialButtonStyle
,使用此父主题 Theme.MaterialComponents.DayNight.NoActionBar
。
那么主题应该是这样的:
<style name="NewAppTheme"
parent="Theme.MaterialComponents.DayNight.NoActionBar">
.......
<-- IMPORTANT if you are using com.google.android.material.button.MaterialButton to style them use this parameter
<item name="materialButtonStyle">@style/ButtonStyle</item>
</style>
并且在 ButtonStyle
中,您可以像这样更改按钮属性:
<style name="ButtonStyle" parent="Widget.MaterialComponents.Button.UnelevatedButton">
<item name="android:minHeight">60dp</item>
</style>