Невозможно изменить фон кнопки, используя темы - PullRequest
2 голосов
/ 02 мая 2020

Я хочу установить пользовательские стили для кнопки в моем приложении, но я пытаюсь сделать это, настраивая пользовательскую тему, и она не работает. Например, это не меняет фон

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

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

Если я делаю то же самое с использованием стилей, он отлично работает

1 Ответ

1 голос
/ 02 мая 2020

То, что там происходит, это то, что атрибут background переопределяется стилем по умолчанию 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>
...