Коли слід використовувати Theme.AppCompat vs ThemeOverlay.AppCompat?


114

Існують такі класи 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 проти Theme.AppCompat.Light? Я бачу, що для ThemeOverlay визначено набагато менше атрибутів - мені цікаво, що призначений варіант використання для ThemeOverlay.

Відповіді:


71

Відповідно до цієї публікації в блозі "Тема проти стилю " автора AppCompat:

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

ThemeOverlay + ActionBar

Пристрасні очі вам також побачать похідні теми TheBreme ActionBar:

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

Їх слід використовувати лише на панелі дій через новий actionBarThemeатрибут або безпосередньо встановити на панелі інструментів.

Єдине , що вони в даний час роблять по- іншому їх батьків в тому , що вони змінюють colorControlNormalбути android:textColorPrimary, таким чином , роблячи який - або текст і іконки непрозорим.


155

Theme.AppCompat використовується для встановлення глобальної теми для всього додатка. ThemeOverlay.AppCompat використовується для заміщення (або "накладання") на цю тему для конкретних представлень даних, особливо Панелі інструментів.

Давайте розглянемо приклад, для чого це необхідно.

Теми додатків за допомогою ActionBar

ActionBar зазвичай відображається в додатку. Я можу вибрати його колір, встановивши colorPrimaryзначення. Однак зміна теми змінює колір тексту на панелі дій.

<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>

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

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

Приховування панелі дій та використання панелі інструментів

Вся суть у використанні Theme.AppCompat, а не Theme.Material полягає в тому, що ми можемо дозволити старішим версіям Android використовувати тему дизайну матеріалів. Проблема полягає в тому, що старіші версії Android не підтримують ActionBar. Таким чином, документація рекомендує приховати ActionBar та додати панель інструментів до вашого макета. Щоб приховати ActionBar, ми повинні використовувати одну з NoActionBarтем. На наступних зображеннях показана Панель інструментів із прихованою панеллю ActionBar.

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

Але що робити, якщо я хочу щось подібне до світлової теми з 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?
gegobyte

Мені цікаво, як цього досягти за допомогою нового MaterialToolbar
Девіда

@David, зараз я здебільшого працюю з Flutter, тому я не продовжував працювати над новими розробниками Android. Якщо ви знайдете відповідь, не соромтеся повернутися сюди і залишити коментар, відредагуйте мою відповідь або додайте власну відповідь.
Сурагч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.