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"
Подальше навчання
Я дізнався це за допомогою експерименту та шляхом читання наступних статей.