Як я стилю appcompat-v7 панелі інструментів, як Theme.AppCompat.Light.DarkActionBar?


105

Я намагаюся відтворити зовнішній вигляд за Theme.AppCompat.Light.DarkActionBarдопомогою нової Панелі інструментів бібліотеки підтримки.

Якщо я виберу, Theme.AppCompat.Lightпанель інструментів буде світлою, а якщо я виберу - Theme.AppCompatбуде темною. (Технічно ви повинні використовувати .NoActionBarверсію, але, наскільки я можу сказати, єдина різниця

<style name="Theme.AppCompat.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

Тепер немає нічого, Theme.AppCompat.Light.DarkActionBarале наївно я подумав, що буде досить добре просто зробити своє

<style name="Theme.AppCompat.Light.DarkActionBar.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

Однак з цим мої панелі інструментів все ще є Lightтематичними. Я витрачав години на тестування різних комбінацій змішування темної (базової) теми та світлової теми, але я просто не можу знайти комбінацію, яка дозволить мені мати легкі фони для всього, крім панелей інструментів.

Чи є спосіб отримати AppCompat.Light.DarkActionBarвигляд із імпортом android.support.v7.widget.Toolbar?

Відповіді:


216

Рекомендованим способом стилізації Панелі інструментів для Light.DarkActionBarклону було б використовувати Theme.AppCompat.Light.DarkActionbarяк тему батьків / додатків та додати наступні атрибути до стилю, щоб приховати типовий параметр ActionBar:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

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

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>

Для подальших модифікацій ви б створили стилі, що розширюють ThemeOverlay.AppCompat.Dark.ActionBarта ThemeOverlay.AppCompat.Lightзамінюють стилі всередині AppBarLayout->android:themeта Toolbar->app:popupTheme. Також зауважте, що це підійде, ?attr/colorPrimaryякщо ви встановили його в основному стилі, щоб ви могли отримати інший колір фону.

Ви знайдете хороший приклад цього в поточному шаблоні проекту з Empty ActivityAndroid Studio (1.4+).


1
Ну так можна. "Якщо ви хочете успадкувати стилі, які ви самі визначили, не потрібно використовувати батьківський атрибут. Натомість просто вставте префікс назви стилю, який ви хочете успадкувати, до імені вашого нового стилю, розділеного періодом . " developer.android.com/guide/topics/ui/themes.html#Inheritance
14:22

1
Крім того, використовуючи розміщений вами xml, я отримую білу панель інструментів з білим текстом або якщо я зміню тему, ThemeOverlay.AppCompat.ActionBarя отримую білу панель інструментів з чорним текстом, щоб вона, здається, не працювала так добре. Чи не схоже , системи турбот про <item name="android:colorBackground">@color/background_material_dark</item>дюймі Base.ThemeOverlay.AppCompat.Dark. Але я продовжую копати. (І я прочитав цю сторінку. Це було однією з моїх відправних точок. Досі, здається, це не працює.)
14-14

1
Вибач за це. Залишив колір фону на Панелі інструментів для простоти і не перевірив результати. Відповідь я переглянув відповідно. Я не знайшов способу зробити це лише за допомогою стилів. Оскільки в моєму додатку є різні кольорові схеми, я використовую android:background="?attr/colorPrimary"на панелі інструментів і <item name="colorPrimary">@color/background_material_dark</item>в своєму стилі, щоб він автоматично адаптував основний колір програми.
oRRs

1
це більше не працює в програмі compat 23, а назва - чорна, а не біла: /
Rashad.Z

21
чи є можливість впоратися з цим джунглями тем та стилів?
axd

72

Редагувати: Після оновлення до appcompat-v7: 22.1.1 та використання AppCompatActivityзамість ActionBarActivityстилів.xml виглядає так:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Примітка. Це означає, що я використовую Toolbarнаданий фреймворк (НЕ включений у XML-файл).

Це працювало для мене:
файл styles.xml:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Оновлення: цитата з блогу Габріелі Маріоти .

За допомогою нової Панелі інструментів ви можете застосувати стиль та тему. Вони різні! Стиль є локальним для перегляду Панелі інструментів, наприклад, кольору фону. Тема app: замість цього є глобальною для всіх елементів інтерфейсу, надутих на Панелі інструментів, наприклад, кольору заголовка та піктограм.


"Помилка: не знайдено жодного ресурсу, який би відповідав заданому імені: attr 'colorPrimary'." Ми говоримо про використання appcompat_v7 тут.
Яр

Для мене це працює лише на пристроях Lollipop. На попередньому льодянику не тільки панель дій, але й усі дії використовують темну тему, яка не є тим, що я хотів. Я схвалив, але наприкінці я використав відповідь oRR, стилізуючи єдиний вид панелі інструментів.
lorenzo-s

@ lorenzo-s Я оновив свою відповідь на останню версію програми. Я також тестував його на Galaxy Nexus з android 4.3 і він працює
LordRaydenMK

31

Гаразд після того, як я багато часу заглибився в цю проблему, це шлях, яким я зумів отримати вигляд, на який я сподівався. Я роблю це окремою відповіддю, щоб я міг отримати все в одному місці.

Це поєднання факторів.

По-перше, не намагайтеся змусити панелі інструментів грати добре через просто теми. Здається, це неможливо.

Тому застосовуйте теми явно на панелях інструментів, як у відповіді oRR

layout / toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:theme="@style/Dark.Overlay"
    app:popupTheme="@style/Dark.Overlay.LightPopup" />

Однак це чарівний соус. Щоб насправді отримати кольори фону, я сподівався, що вам доведеться перекрити backgroundатрибут у темах панелі інструментів

значення / styles.xml:

<!-- 
    I expected android:colorBackground to be what I was looking for but
    it seems you have to override android:background
-->
<style name="Dark.Overlay" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">?attr/colorPrimary</item>
</style>

<style name="Dark.Overlay.LightPopup" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:background">@color/material_grey_200</item>
</style>

то просто включіть макет панелі інструментів до інших макетів

<include android:id="@+id/mytoolbar" layout="@layout/toolbar" />

і ти добре підеш.

Сподіваюся, це допомагає комусь іншому, тому вам не доведеться витрачати на це стільки часу, скільки я.

(якщо хтось може зрозуміти, як зробити цю роботу, використовуючи лише теми, тобто не потрібно явно застосовувати теми у файлах макета, я з радістю підтримаю їх відповідь)

Редагувати:

Тож, очевидно, розміщення більш повної відповіді було зниженим магнітом, тому я просто прийму неповний відповідь вище, але залиште цю відповідь тут у випадку, якщо комусь це справді потрібне. Не соромтеся продовжувати звучати, якщо це робить вас щасливим.


2
У своєму AppTheme я просто помістив <item name="colorPrimary">@color/colorPrimary</item> Тоді я вільний у використанні android:background="?attr/colorPrimary"атрибута у своєму віджеті Панелі інструментів.
лемуель

Чи можу я знати, як ви отримуєте визначення "@ color / material_grey_200"?
Чак Ян Чен

Я не пам’ятаю, де саме, але хтось створив файл color.xml на основі google.com/design/spec/style/color.html#color-color-palette, однак зараз не може його знайти
Liminal

1
@Liminal Якщо ви використовуєте, @android:color/transparentви уникаєте проблеми, коли довго натискаєте / клацаєте на пункт меню, навколо тексту є поле. Це також підтверджує майбутнє, якщо світлий колір фону змінюється в майбутньому.
Ryan R

Не працює, хоча ви використовуєте CollapsingToolbarLayout.
arekolek

17

Найчистіший спосіб, який я знайшов для цього, - це створити дитину " ThemeOverlay.AppCompat.Dark.ActionBar ". У прикладі я встановив колір тла панелі інструментів на КРАСНИЙ, а колір тексту - СВІТИЙ.

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#FF0000</item>
    <item name="android:textColorPrimary">#0000FF</item>
</style>

Потім ви можете застосувати свою тему на панелі інструментів:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:theme="@style/MyToolbar"
    android:minHeight="?attr/actionBarSize"/>

6
мій бог, це було все! textColorPrimary! Чому це було так проклято важко знайти де завгодно
Маппет

12

Щоб налаштувати стиль панелі інструментів, спочатку створіть користувацький стиль панелі інструментів, успадковуючи Widget.AppCompat.Toolbar, замініть властивості, а потім додайте його до теми власної програми, як показано нижче, див. Http://www.zoftino.com/android-toolbar-tutorial для більше інформаційної панелі інструментів та стилів.

   <style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="toolbarStyle">@style/MyToolBarStyle</item>
    </style>
    <style name="MyToolBarStyle" parent="Widget.AppCompat.Toolbar">
        <item name="android:background">#80deea</item>
        <item name="titleTextAppearance">@style/MyTitleTextAppearance</item>
        <item name="subtitleTextAppearance">@style/MySubTitleTextAppearance</item>
    </style>
    <style name="MyTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
        <item name="android:textSize">35dp</item>
        <item name="android:textColor">#ff3d00</item>
    </style>
    <style name="MySubTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
        <item name="android:textSize">30dp</item>
        <item name="android:textColor">#1976d2</item>
    </style>

7

Ви можете спробувати це нижче.

<style name="MyToolbar" parent="Widget.AppCompat.Toolbar">
    <!-- your code here -->
</style>

А деталізовані елементи ви можете знайти на https://developer.android.com/reference/android/support/v7/appcompat/R.styleable.html#Toolbar

Ось ще трохи: TextAppearance.Widget.AppCompat.Toolbar.Title, TextAppearance.Widget.AppCompat.Toolbar.Subtitle, Widget.AppCompat.Toolbar.Button.Navigation.

Сподіваюся, що це може вам допомогти.


1
Так. З тими, з якими я можу отримати правильний колір фону, я нарешті зрозумів, як правильно підібрати кольори заголовка. Однак зараз вбивчою річчю є те, що я не можу зрозуміти, де кнопка переповнення отримує її колір. Незалежно від того, що я змінив, він залишається таким темним, що не відображається проти моєї темної панелі дій. Якщо я поміняю тему на темну, то вона світла і відображається добре. Однак, скільки б я не копався, я не можу зрозуміти, як змусити піктограму переповнення світла, коли я почав із легкої теми
Liminal

0

Схожий на Арнава Рао, але з іншим батьком:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="toolbarStyle">@style/MyToolbar</item>
</style>

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#ff0000</item>
</style>

При такому підході зовнішній вигляд Панелі інструментів повністю визначається у стилях додатків, тому вам не потрібно розміщувати будь-яку кладку на кожній панелі інструментів.


2
Насправді android:toolbarStyleце API 21+ для android.widget.Toolbar. toolbarStyleє AppCompat для android.support.v7.widget.Toolbar.
Євген Печанець

Я думав, що Android Studio видає мені проблему, але на другому тесті ти маєш рацію! Це чудова новина - мені вдалося знову збити свій minSDK до 19, і, схоже, моя панель інструментівStyle все ще працює чудово! Дякую!
craigmj

Щойно помітили! Досі існує непорозуміння стилів та тем . MyToolbarстиль не повинен поширюватись Widget.AppCompat.Toolbarна тему.
Євген Печанець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.