Theme.AppCompat используется для установки глобальной темы для всего приложения. ThemeOverlay.AppCompat используется для переопределения (или «наложения») этой темы для определенных представлений, особенно для панели инструментов.
Давайте посмотрим на примере, почему это необходимо.
Темы приложений с ActionBar
ActionBar обычно отображается в приложении. Я могу выбрать его цвет, установив colorPrimary
значение. Однако при изменении темы изменяется цвет текста на ActionBar.
<style name="AppTheme" parent="Theme.AppCompat">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
Поскольку мой основной цвет - темно-синий, мне, вероятно, следует использовать одну из тем, в которой используется светлый цвет текста на панели действий, потому что черный текст трудно читать.
Скрытие ActionBar и использование панели инструментов
Весь смысл использования Theme.AppCompat, а не Theme.Material заключается в том, что мы можем разрешить более старым версиям Android использовать нашу тему дизайна материалов. Проблема в том, что более старые версии Android не поддерживают ActionBar. Таким образом документации рекомендуется скрыть ActionBar и добавить панель инструментов в ваш макет. Чтобы скрыть ActionBar, мы должны использовать одну из NoActionBar
тем. На следующих изображениях показана панель инструментов со скрытой панелью действий.
Но что, если мне нужно что-то вроде темы Light с DarkActionBar? Поскольку мне нужно использовать NoActionBar, это не вариант.
Переопределение темы приложения
Вот где появляется ThemeOverlay. Я могу указать тему Dark ActionBar в моем XML-макете панели инструментов.
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
Это наконец позволяет нам добиться желаемого эффекта. Тема Dark.ActionBar накладывается на тему приложения Light для этого конкретного случая.
- Тема приложения:
Theme.AppCompat.Light.NoActionBar
- Тема панели инструментов:
ThemeOverlay.AppCompat.Dark.ActionBar
Если вы хотите, чтобы всплывающее меню было светлым, вы можете добавить это:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Дальнейшее обучение
Я узнал об этом путем экспериментов и чтения следующих статей.