Android 如何自定义AppCompat材质按钮样式?

Android 如何自定义AppCompat材质按钮样式?,android,android-ui,android-theme,android-appcompat,Android,Android Ui,Android Theme,Android Appcompat,我正在使用AppCompat主题,我想在我的按钮上设置minHeight属性: <style name="Theme.MyTheme" parent="Theme.AppCompat"> <item name="android:buttonStyle">@style/MyButtonStyle</item> </style> <style name="MyButtonStyle" parent="...?"> <

我正在使用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>

@样式/我的按钮样式
60dp
但是,没有
Widget.AppCompat.Button
样式设置为
MyButtonStyle
的父级。如果我使用android:Widget.Button,那么我所有的按钮看起来都像旧的蹩脚风格。我尝试了各种其他AppCompat主题,如
textAppAppAppAppAppAppAppAtt.Button
,但它们不起作用

省略按钮样式的父主题也会导致按钮样式不正确


如何自定义默认的
主题。AppCompat
按钮样式

要回答我自己的问题,现在出现了
按钮
小部件:

AppCompat在早期版本的Android上提供了类似的行为 对于UI小部件的子集:

  • AppCompat工具栏提供的一切(操作模式等)
  • 编辑文本
  • 纺纱机
  • 复选框
  • 单选按钮
  • Switch(使用新的android.support.v7.widget.SwitchCompat)
  • CheckedTextView

我看到的唯一解决办法是从Android源代码中重新创建材质按钮样式,这一任务超出了我的期望范围。

您可以使用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按钮样式(至少现在还没有)

编辑


这假设您可以在比棒棒糖更老的平台上使用Holo按钮。它感觉不显眼,如果您可以不使用Ripple,它应该很好。如果您想要Ripple,我建议您在谷歌上搜索第三方棒棒糖按钮库。

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

你的颜色
@颜色/颜色重音
@android:彩色/白色
在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
而不是常规的
按钮

但是为了给它设置样式,在主题中使用了不同的属性 -
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>
<style name="ButtonStyle" parent="Widget.MaterialComponents.Button.UnelevatedButton">
    <item name="android:minHeight">60dp</item>
</style>

谢谢。出于某种原因,我一直在考虑将按钮主题设置为Holo在15-20版上不起作用,但它确实起作用,并产生了预期的效果。它现在支持22.1.0 compile'com.android。支持:android Studio中build.gradle中的appcompat-v7:22.0.0'似乎无法获得该软件包。我应该如何包含v22?最新版本的appcompat确实有一个按钮:android.support.v7.widget.AppCompatButton他们现在也添加了一个按钮:android.support.v7.widget.AppCompatButton这是我的方法,直到我注意到禁用的按钮看起来和启用的按钮一样