Jak ustawić styl paska narzędzi appcompat-v7 na przykład Theme.AppCompat.Light.DarkActionBar?

105

Próbuję odtworzyć wygląd Theme.AppCompat.Light.DarkActionBarza pomocą nowego paska narzędzi Toolbar.

Jeśli wybiorę, Theme.AppCompat.Lightmój pasek narzędzi będzie jasny, a jeśli wybiorę Theme.AppCompat, będzie ciemny. (Technicznie musisz użyć .NoActionBarwersji, ale o ile wiem, jedyną różnicą jest

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

Teraz nie ma, Theme.AppCompat.Light.DarkActionBarale naiwnie pomyślałem, że wystarczy zrobić własne

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

Jednak dzięki temu moje paski narzędzi są nadal Lighttematyczne. Spędziłem wiele godzin próbując różnych kombinacji mieszania motywu Dark (podstawowego) i motywu Light, ale po prostu nie mogę znaleźć kombinacji, która pozwoliłaby mi mieć jasne tło na wszystkim oprócz pasków narzędzi.

Czy istnieje sposób na uzyskanie AppCompat.Light.DarkActionBarwyglądu za pomocą importu android.support.v7.widget.Toolbar?

Liminal
źródło

Odpowiedzi:

216

Zalecanym sposobem stylizacji paska narzędzi dla Light.DarkActionBarklona byłoby użycie Theme.AppCompat.Light.DarkActionbarjako motywu nadrzędnego / aplikacji i dodanie następujących atrybutów do stylu, aby ukryć domyślny ActionBar:

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

Następnie użyj następujących elementów jako paska narzędzi:

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

W celu dalszych modyfikacji utworzyłbyś style, rozszerzając ThemeOverlay.AppCompat.Dark.ActionBari ThemeOverlay.AppCompat.Lightzastępując style w AppBarLayout->android:themei Toolbar->app:popupTheme. Zauważ również, że podniesie to twój poziom, ?attr/colorPrimaryjeśli ustawiłeś go w swoim głównym stylu, dzięki czemu możesz uzyskać inny kolor tła.

Znajdziesz tego dobry przykład w bieżącym szablonie projektu z Empty ActivityAndroid Studio (1.4+).

oRRs
źródło
1
Cóż, tak, możesz. „Jeśli chcesz dziedziczyć po stylach, które sam zdefiniowałeś, nie musisz używać atrybutu nadrzędnego. Zamiast tego po prostu wpisz nazwę stylu, który chcesz dziedziczyć, przed nazwą nowego stylu, oddzieloną kropką . ” developer.android.com/guide/topics/ui/themes.html#Inheritance
Liminal
1
Korzystając również z opublikowanego przez Ciebie XML, otrzymuję biały pasek narzędzi z białym tekstem lub jeśli zmienię motyw na ThemeOverlay.AppCompat.ActionBarbiały pasek narzędzi z czarnym tekstem, więc wydaje się, że nie działa tak dobrze. Nie wydaje się troskami systemowych o <item name="android:colorBackground">@color/background_material_dark</item>in Base.ThemeOverlay.AppCompat.Dark. Ale będę kopać dalej. (I przeczytałem tę stronę. To był jeden z moich punktów wyjścia. Nadal nie wydaje się działać.)
Liminal
1
Przepraszam za to. Pozostawiono kolor tła paska narzędzi dla uproszczenia i nie przetestowano wyników. Odpowiednio poprawiłem odpowiedź. Jednak nie znalazłem sposobu, aby to zrobić tylko za pomocą stylów. Ponieważ moja aplikacja ma różne schematy kolorów, używam android:background="?attr/colorPrimary"na pasku narzędzi i <item name="colorPrimary">@color/background_material_dark</item>w moim stylu, więc automatycznie dostosowuje podstawowy kolor aplikacji.
oRRs
1
to już nie działa w zgodności aplikacji 23, a tytuł jest czarny, a nie biały: /
Rashad.Z
21
czy jest jakiś sposób, aby opanować tę dżunglę tematów i stylów?
axd
72

Edycja: Po aktualizacji do appcompat-v7: 22.1.1 i użyciu AppCompatActivityzamiast ActionBarActivitymojego styles.xml wygląda następująco:

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

Uwaga: Oznacza to, że używam Toolbardostarczonego przez framework (NIE zawartego w pliku XML).

To zadziałało dla mnie:
plik 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>

Aktualizacja: cytat z bloga Gabriele Mariotti .

Za pomocą nowego paska narzędzi możesz zastosować styl i motyw. Oni są różni! Styl jest lokalny dla widoku paska narzędzi, na przykład kolor tła. Zamiast tego motyw app: theme jest globalny dla wszystkich elementów interfejsu użytkownika na pasku narzędzi, na przykład dla koloru tytułu i ikon.

LordRaydenMK
źródło
„Błąd: nie znaleziono zasobu pasującego do podanej nazwy: attr 'colorPrimary'.” Mówimy tutaj o używaniu appcompat_v7.
Yar
U mnie działa to tylko na urządzeniach Lollipop. Na pre-lollipopie nie tylko pasek akcji, ale cała aktywność używa ciemnego motywu, co nie jest tym, czego chciałem. Głosowałem za, ale na koniec użyłem odpowiedzi ORR, stylizując pojedynczy widok paska narzędzi.
lorenzo-s
@ lorenzo-s Zaktualizowałem moją odpowiedź o najnowszą wersję appcompat. Przetestowałem go też na Galaxy Nexusie z
Androidem
31

Ok, po zbyt długim czasie zagłębiania się w ten problem, w ten sposób udało mi się uzyskać taki wygląd, na jaki liczyłem. Podaję osobną odpowiedź, aby wszystko było w jednym miejscu.

To kombinacja czynników.

Po pierwsze, nie próbuj ładnie odtwarzać paski narzędzi tylko za pomocą motywów. Wydaje się to niemożliwe.

Więc zastosuj motywy jawnie do swoich pasków narzędzi, tak jak w odpowiedzi 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" />

Jednak to jest magiczny sos. Aby faktycznie uzyskać kolory tła, na które liczyłem, musisz zastąpić backgroundatrybut w motywach paska narzędzi Toolbar

values ​​/ 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>

następnie po prostu dołącz układ paska narzędzi do innych układów

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

i jesteś gotowy.

Mam nadzieję, że pomoże to komuś innemu, więc nie musisz poświęcać na to tyle czasu, co ja.

(jeśli ktoś może dowiedzieć się, jak sprawić, by to działało, używając tylko motywów, tj. bez konieczności stosowania motywów bezpośrednio w plikach układu, chętnie pomogę zamiast tego)

EDYTOWAĆ:

Najwyraźniej zamieszczenie pełniejszej odpowiedzi było magnesem negatywnym, więc zaakceptuję powyższą niekompletną odpowiedź, ale zostawię ją tutaj, na wypadek gdyby ktoś jej rzeczywiście potrzebował. Możesz jednak nadal głosować w dół, jeśli to cię uszczęśliwia.

Liminal
źródło
2
W moim AppTheme właśnie umieściłem <item name="colorPrimary">@color/colorPrimary</item> Następnie mogę używać android:background="?attr/colorPrimary"atrybutu w moim widżecie paska narzędzi Toolbar.
lemuel
Czy mogę wiedzieć, jak można uzyskać definicję „@ color / material_grey_200”?
Cheok Yan Cheng
Nie pamiętam dokładnie, gdzie, ale ktoś utworzył plik colors.xml na podstawie google.com/design/spec/style/color.html#color-color-palette nie może go teraz znaleźć
Liminal
1
@Liminal Jeśli używasz @android:color/transparent, unikniesz problemu po długim naciśnięciu / kliknięciu pozycji menu, wokół tekstu znajduje się ramka. To również potwierdza przyszłość, jeśli kolor jasnego tła zmieni się w przyszłości.
Ryan R
Nie działa jednak, gdy używasz CollapsingToolbarLayout.
arekolek
17

Najprostszym sposobem, w jaki udało mi się to zrobić, jest utworzenie elementu potomnego „ ThemeOverlay.AppCompat.Dark.ActionBar ”. W przykładzie ustawiłem kolor tła paska narzędzi na CZERWONY, a kolor tekstu na NIEBIESKI.

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

Następnie możesz zastosować motyw do paska narzędzi:

<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"/>
Don
źródło
6
mój Boże, to było to! textColorPrimary! Dlaczego to było tak cholernie trudne do znalezienia gdziekolwiek
Muppet
12

Aby dostosować styl paska narzędzi, najpierw utwórz niestandardowy styl paska narzędzi dziedziczący Widget.AppCompat.Toolbar, zastąp właściwości, a następnie dodaj go do niestandardowego motywu aplikacji, jak pokazano poniżej, zobacz http://www.zoftino.com/android-toolbar-tutorial dla Więcej informacji pasek narzędzi i style.

   <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>
Arnav Rao
źródło
7

Możesz spróbować tego poniżej.

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

I szczegółowe elementy, które możesz znaleźć na https://developer.android.com/reference/android/support/v7/appcompat/R.styleable.html#Toolbar

Oto kilka: TextAppearance.Widget.AppCompat.Toolbar.Title, TextAppearance.Widget.AppCompat.Toolbar.Subtitle, Widget.AppCompat.Toolbar.Button.Navigation.

Mam nadzieję, że to może ci pomóc.

Yong
źródło
1
Tak. Dzięki tym udało mi się uzyskać właściwy kolor tła i w końcu wymyśliłem, jak uzyskać właściwe kolory tytułów. Jednak teraz zabójcą jest to, że nie mogę dowiedzieć się, skąd przycisk przepełnienia ma swój kolor. Bez względu na to, co zmienię, pozostaje tak ciemne, że nie widać na moim ciemnym pasku akcji. Jeśli zmienię motyw na ciemny, to jest jasny i dobrze się wyświetla, jednak bez względu na to, jak dużo kopię, nie wiem, jak sprawić, by ikona przepełnienia świeciła światłem, gdy zacząłem od jasnego motywu
Liminal
0

Podobny do Arnav Rao, ale z innym rodzicem:

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

Dzięki takiemu podejściu wygląd paska narzędzi jest całkowicie zdefiniowany w stylach aplikacji, więc nie ma potrzeby umieszczania stylów na każdym pasku narzędzi.

craigmj
źródło
2
Właściwie android:toolbarStyleto API 21+ dla android.widget.Toolbar. toolbarStylejest AppCompat dla android.support.v7.widget.Toolbar.
Eugen Pechanec
Myślałem, że Android Studio daje mi z tym problem, ale po drugim teście masz rację! To świetna wiadomość - udało mi się ponownie obniżyć mój minSDK do 19 i wygląda na to, że mój toolbarStyle nadal działa dobrze! Dziękuję Ci!
craigmj
Właśnie zauważyłem! Nadal istnieje niezrozumienie stylów i motywów . MyToolbarstyl nie powinien rozszerzać Widget.AppCompat.Toolbartematu.
Eugen Pechanec