Intereting Posts
Волейбол, не вызывающий getParams () для стандартного запроса POST Как предоставить / dev / bus / usb разрешения для приложений libusb android? Как нарисовать растровое изображение в андроиде? Android – получить высоту родительского макета Как добавить тень вокруг кругового изображения HttpMessageNotReadableException: не удалось прочитать JSON: непризнанное поле, использующее Spring для Android Lazy Injection с кинжалом 2 на Android Реализация 47degree android-swipelistview для прокрутки android ListViewItem Как избежать специальных символов, например, в sqlite в android Тесты Android с Gradle: изменение имени выходного файла теста JUnit Кэш зависимостей Android Gradle может быть поврежден и не работает. Android-разработчик переходит на iOS. Что мне нужно знать? Время доставки GCM-сообщений WILDLY беспорядочно Как избежать отклонения разрешения EACCES на SDCARD с версией KITKAT 4.4.2. Новая политика из Google Веб-просмотр Android: Внесите локальный файл Javascript на удаленную веб-страницу

Когда следует использовать Theme.AppCompat против ThemeOverlay.AppCompat?

Существуют следующие классы Theme.AppCompat:

Theme.AppCompat Theme.AppCompat.Light Theme.AppCompat.Light.DarkActionBar Theme.AppCompat.NoActionBar Theme.AppCompat.Light.NoActionBar Theme.AppCompat.DialogWhenLarge Theme.AppCompat.Light.DialogWhenLarge Theme.AppCompat.Dialog Theme.AppCompat.Light.Dialog Theme.AppCompat.CompactMenu 

И следующие классы ThemeOverlay.AppCompat:

 ThemeOverlay.AppCompat ThemeOverlay.AppCompat.Light ThemeOverlay.AppCompat.Dark ThemeOverlay.AppCompat.ActionBar ThemeOverlay.AppCompat.Dark.ActionBar 

Зачем использовать ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light например? Я вижу, что для ThemeOverlay определено гораздо меньше атрибутов – мне любопытно, что предназначен для использования в ThemeOverlay.

Solutions Collecting From Web of "Когда следует использовать Theme.AppCompat против ThemeOverlay.AppCompat?"

По этой теме vs Style в блоге от создателя AppCompat:

[ThemeOverlays] – специальные темы, которые накладывают обычные темы Theme.Material, переписывая соответствующие атрибуты, чтобы сделать их светлыми / темными.

ThemeOverlay + ActionBar

Острый взгляд на вас также увидит производные ActionBar ThemeOverlay:

  • ThemeOverlay.Material.Light.ActionBar
  • ThemeOverlay.Material.Dark.ActionBar

Они должны использоваться только с actionBarTheme действий через новый атрибут actionBarTheme или непосредственно устанавливаться на панели инструментов.

Единственное, что они в настоящее время делают по-разному с родителями, это то, что они меняют colorControlNormal как android:textColorPrimary , тем самым делая любой текст и значки непрозрачными.

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 . На следующих изображениях отображается панель инструментов с скрытым ActionBar.

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

Но что, если я хочу что-то вроде темы 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" 

Дальнейшее изучение

Я узнал об этом через эксперименты и прочитал следующие статьи.

  • Настройка панели приложений
  • Использовать андроид: тему и ThemeOverlay для конкретных тем Просмотров и их потомков
  • Темы с AppCompat
  • Использовать colorPrimary, чтобы раскрасить вашу панель приложений.
  • Тема против стиля