无法使用主题更改按钮背景

Cannot change button background using themes

我想为我的应用程序中的按钮设置自定义样式,但我尝试设置自定义主题但它不起作用。例如,这不会改变背景

<Button
  android:theme="@style/CustomTheme"
  ... />

<style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   <item name="android:background">@color/colorPrimary</item>
</style>

如果我使用样式做同样的事情,效果很好

发生的事情是背景属性被 Button 的默认样式覆盖。默认样式在您的主题中设置,如果您查看 Theme.AppCompat.Light.DarkActionBar(您继承自的主题),您将看到以下继承结构:

Theme.AppCompat.Light.DarkActionBar
    Base.Theme.AppCompat.Light.DarkActionBar
        Base.Theme.AppCompat.Light
            Base.V7.Theme.AppCompat.Light

Base.V7.Theme.AppCompat.Light 中,您会找到 buttonStyle 属性定义,这是 Button 元素的默认样式:

<item name="buttonStyle">@style/Widget.AppCompat.Button</item>

同样,如果您看一下 Widget.AppCompat.Button,您会发现它继承自 Base.Widget.AppCompat.Button 并且它设置了 android:background 属性(在其他属性之间)。

因此,为了改变主题中 Button 的样式,您应该使用 buttonStyle 属性。您最安全的选择是创建一个继承自 Widget.AppCompat.Button 的新样式(这样您就不会丢失在那里设置的所有其他属性)并在那里设置 android:background 属性:

<style name="CustomStyle" parent="Widget.AppCompat.Button">
    <item name="android:background">@color/colorPrimary</item>
</style>

<style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   <item name="buttonStyle">@style/CustomStyle</item>
</style>