Фон ActionBar с темой MaterialComponents

Я хочу настроить свой ActionBar. Моя тема выглядит следующим образом:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
    <item name="actionBarStyle">@style/MyActionBar</item>
</style>

<style name="MyActionBar" parent="@style/ThemeOverlay.MaterialComponents.ActionBar">
    <item name="background">@drawable/actionBarBackground</item>
</style>

В папке значений:

<drawable name="actionBarBackground">#FFFFFFFF</drawable>

В папке значений-ночи:

<drawable name="actionBarBackground">#FF000000</drawable>

Не уверен, почему мой цвет фона ActionBar не меняется соответственно. Я пытался изменить свою тему и другими способами, но ничего не работает. Вот мои другие попытки:

Вместо actionBarStyle я использовал actionBarTheme.

<item name="actionBarTheme">@style/MyActionBar</item>

Я также пытался использовать colorPrimary.

<item name="colorPrimary">@color/actionBarBackground</item>

Я что-то упускаю?


comment
Вероятно, это потому, что вы объявили цвет как рисуемый, что не является одним и тем же понятием.   -  person Edric    schedule 13.10.2019
comment
Я также пробовал с цветами, но все та же проблема.   -  person Chandra Sekhar    schedule 13.10.2019
comment
Вы используете панель действий или панель инструментов?   -  person Gabriele Mariotti    schedule 13.10.2019
comment
В файле макета моей активности ничего нет. Поскольку моя тема Theme.MaterialComponents.DayNight, она по умолчанию включает панель действий.   -  person Chandra Sekhar    schedule 14.10.2019


Ответы (4)


Поскольку вы используете тему приложения Theme.MaterialComponents.DayNight, цвет фона ActionBar по умолчанию определяется атрибутом colorPrimary.

  <style name="AppThemeActionBar" parent="Theme.MaterialComponents.DayNight">
    <item name="colorPrimary">@color/mycolor</item>
  </style>

где mycolor определяется в res/values/colors.xml

<resources>
  <color name="mycolor">#xxxxxx</color>
  ...
</resources>

Вы также можете настроить цвет фона с помощью атрибута actionBarStyle в теме приложения.
Примерно так:

  <style name="AppThemeActionBar" parent="Theme.MaterialComponents.DayNight">
      <item name="actionBarStyle">@style/Custom.ActionBar</item>
      ...
  </style>

куда:

  <style name="Custom.ActionBar" parent="Widget.MaterialComponents.Light.ActionBar.Solid">
    <item name="background">@color/mycolor</item>
  </style>

В противном случае вы можете использовать атрибут actionBarTheme, чтобы переопределить цвет фона:

  <style name="AppThemeActionBar" parent="Theme.MaterialComponents.DayNight">
    <item name="actionBarTheme">@style/ThemeOverlay.ActionBar</item>
    ...
  </style>

  <style name="ThemeOverlay.ActionBar" parent="">
    <item name="colorPrimary">@color/mycolor</item>
  </style>

введите описание изображения здесь

person Gabriele Mariotti    schedule 13.10.2019
comment
Непонятно, в чем разница между использованием actionBarStyle и actionBarTheme? - person David; 15.01.2020
comment
Спасибо, ваше второе предложение, переопределяющее Widget.MaterialComponents.Light.ActionBar.Solid, сработало для меня. - person Bryan W; 20.01.2020
comment
@David: оба являются атрибутами, но actionBarStyle — это стиль, в котором вы можете настроить некоторые атрибуты, такие как фон, стиль текста заголовка ... в то время как actionBarTheme — это наложение темы, где вы можете переопределить некоторые значения, определенные в теме приложения, например colorPrimary, но только для определенного виджета, в данном случае ActionBar. - person Gabriele Mariotti; 01.07.2020
comment
По-видимому, если ваша тема наследуется от Material, actionBarStyle полностью игнорируется, и ЕДИНСТВЕННЫЙ способ стилизации панели действий — через actionBarTheme. Потратил на это еще полдня. - person rmirabelle; 28.01.2021

Мне не помогли ни установка фона, ни colorPrimary. По-видимому, это предполагаемое поведение, как согласно рекомендации по темной теме для компонентов, занимающих большую часть экрана. Они должны использовать для фона colorSurface вместо colorPrimary или colorAccent. AppBarLayouts, Toolbars и ActionBars теперь по умолчанию используются стили Surface в темной теме.

Поэтому мне пришлось определить атрибут colorSurface для моей темы, чтобы он работал.

<item name="colorSurface">@color/my_color_primary_dark</item>
person shtolik    schedule 24.03.2020
comment
большое спасибо, вы молодец, у меня это решение работает, так как для светлого основной цвет подбирается, а для темного ни одно решение не работало, даже с actionbarStyle или actionBarTheme, - person Azhar Ali; 29.03.2021

Я использую последнюю стабильную версию MDC, и вот как это работает здесь.

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
    <item name="colorPrimary">@color/purple_500</item>
    <item name="actionBarStyle">@style/Widget.MaterialComponents.ActionBar.PrimarySurface</item>
</style>

Если вы хотите, чтобы панель приложения была того же цвета, что и ваша цветная поверхность, измените @style/Widget.MaterialComponents.ActionBar.PrimarySurface на @style/Widget.MaterialComponents.ActionBar.Surface.

person hamthenormal    schedule 19.03.2021

Скорее всего, это связано с тем, что это неправильный способ объявления цветов в приложении.

Обычно цветовые ресурсы находятся в одном единственном файле: colors.xml

Этот XML-файл обычно находится в папке ресурсов вашего приложения (обычно res/values/colors.xml).

Затем они объявляются с элементом <resources> в качестве корня XML-файла и ваших цветовых ресурсов (как определено с помощью элемента <color>):

<!-- Note: The XML header (aka <?xml version="1.0" ...?>) is optional -->
<resources>
    <color name="your_color_res">#FFFFFF</color>
    <!-- Your other colour resources go here -->
</resources>

Затем вы можете указать квалификаторы для своих цветовых ресурсов, создав тот же colors.xml в ресурсах вашего приложения со следующим форматом файла:

res/values-<qualifier>/colors.xml

Затем на эти цвета можно ссылаться с префиксом @color/ в файлах XML или с R.color.* в коде вашего приложения на Java/Kotlin.

Надеюсь это поможет!

person Edric    schedule 13.10.2019