Come posso applicare lo stile alla barra degli strumenti di appcompat-v7 come Theme.AppCompat.Light.DarkActionBar?


105

Sto cercando di ricreare l'aspetto di Theme.AppCompat.Light.DarkActionBarcon la nuova barra degli strumenti della libreria di supporto.

Se scelgo la Theme.AppCompat.Lightmia barra degli strumenti sarà chiara e se scelgo Theme.AppCompatsarà scura. (Tecnicamente devi usare la .NoActionBarversione, ma per quanto posso dire l'unica differenza è

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

Ora non c'è, Theme.AppCompat.Light.DarkActionBarma ingenuamente ho pensato che sarebbe stato abbastanza buono per crearne uno mio

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

Tuttavia con questo le mie barre degli strumenti sono ancora a Lighttema. Ho passato ore a provare diverse combinazioni di mescolare il tema Dark (base) e il tema Light, ma non riesco a trovare una combinazione che mi consenta di avere sfondi chiari su tutto tranne che sulle barre degli strumenti.

C'è un modo per ottenere l' AppCompat.Light.DarkActionBaraspetto con import android.support.v7.widget.Toolbar's?

Risposte:


216

Il modo consigliato per Light.DarkActionBardefinire lo stile della barra degli strumenti per un clone sarebbe quello di utilizzare Theme.AppCompat.Light.DarkActionbarcome tema principale / app e aggiungere i seguenti attributi allo stile per nascondere la ActionBar predefinita:

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

Quindi utilizza quanto segue come barra degli strumenti:

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

Per ulteriori modifiche, creerai stili che estendono ThemeOverlay.AppCompat.Dark.ActionBare ThemeOverlay.AppCompat.Lightsostituiscono quelli all'interno di AppBarLayout->android:themee Toolbar->app:popupTheme. Nota anche che questo raccoglierà il tuo file?attr/colorPrimary se lo hai impostato nel tuo stile principale in modo da poter ottenere un colore di sfondo diverso.

Troverai un buon esempio di ciò nel modello di progetto corrente con Empty ActivityAndroid Studio (1.4+).


1
Ebbene sì che puoi. "Se vuoi ereditare da stili che hai definito tu stesso, non devi usare l'attributo genitore. Invece, anteponi semplicemente il nome dello stile che vuoi ereditare al nome del tuo nuovo stile, separato da un punto ". developer.android.com/guide/topics/ui/themes.html#Inheritance
Liminal

1
Anche usando l'xml che hai pubblicato ottengo una barra degli strumenti bianca con testo bianco o se cambio il tema in ThemeOverlay.AppCompat.ActionBaruna barra degli strumenti bianca con testo nero, quindi non sembra funzionare così bene. Non sembra come le cure di sistema sulla <item name="android:colorBackground">@color/background_material_dark</item>a Base.ThemeOverlay.AppCompat.Dark. Ma continuerò a scavare. (E ho letto quella pagina. Quello era uno dei miei punti di partenza. Ancora non sembra funzionare.)
Liminal

1
Mi dispiace per quello. Ha lasciato il colore di sfondo della barra degli strumenti fuori per semplicità e non ha testato i risultati. Ho rivisto la risposta di conseguenza. Tuttavia, non ho trovato un modo per farlo solo usando gli stili. Poiché la mia app ha diversi schemi di colori, lo uso android:background="?attr/colorPrimary"nella barra degli strumenti e <item name="colorPrimary">@color/background_material_dark</item>nel mio stile in modo che si adatti automaticamente al colore principale dell'app.
oRR

1
questo non funziona più nell'app compat 23 e il titolo è nero e non bianco: /
Rashad.Z

21
c'è un modo per avere un controllo su questa giungla di temi e stili?
axd

72

Modifica: dopo l'aggiornamento ad appcompat-v7: 22.1.1 e l'utilizzo al AppCompatActivityposto del ActionBarActivitymio styles.xml appare come:

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

Nota: questo significa che sto utilizzando un Toolbarfornito dal framework (NON incluso in un file XML).

Questo ha funzionato per me:
file 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>

Aggiornamento: una citazione dal blog di Gabriele Mariotti .

Con la nuova barra degli strumenti puoi applicare uno stile e un tema. Sono diversi! Lo stile è locale alla visualizzazione della barra degli strumenti, ad esempio il colore di sfondo. L'app: theme è invece globale per tutti gli elementi dell'interfaccia utente gonfiati nella barra degli strumenti, ad esempio il colore del titolo e delle icone.


"Errore: nessuna risorsa trovata che corrisponde al nome dato: attr 'colorPrimary'." Stiamo parlando dell'utilizzo di appcompat_v7 qui.
Yar

Per me, funziona solo sui dispositivi Lollipop. Nel pre-lecca-lecca non solo la barra delle azioni, ma tutte le attività utilizzano il tema scuro, che non è quello che volevo. Ho votato in alto, ma alla fine ho usato la risposta oRRs, disegnando la singola visualizzazione della barra degli strumenti.
lorenzo-s

@ lorenzo-s Ho aggiornato la mia risposta per l'ultima versione di appcompat. L'ho testato anche su Galaxy Nexus con Android 4.3 e funziona
LordRaydenMK

31

Ok, dopo aver sprecato molto tempo in questo problema, questo è il modo in cui sono riuscito a ottenere l'aspetto che speravo. La sto creando come una risposta separata in modo da poter ottenere tutto in un unico posto.

È una combinazione di fattori.

In primo luogo, non cercare di far funzionare bene le barre degli strumenti solo attraverso i temi. Sembra impossibile.

Quindi applica i temi in modo esplicito alle tue barre degli strumenti come nella risposta 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" />

Tuttavia questa è la salsa magica. Per ottenere effettivamente i colori di sfondo che speravo, devi sovrascrivere l' backgroundattributo nei temi della barra degli strumenti

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

quindi includi semplicemente il layout della barra degli strumenti negli altri layout

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

e sei a posto.

Spero che questo aiuti qualcun altro, quindi non devi dedicare tanto tempo a questo come ho fatto io.

(se qualcuno può capire come farlo funzionare usando solo temi, cioè non dovendo applicare i temi esplicitamente nei file di layout, sosterrò invece volentieri la loro risposta)

MODIFICARE:

Quindi apparentemente pubblicare una risposta più completa è stato un magnete a voto negativo, quindi accetterò semplicemente la risposta incompleta sopra, ma lascerò questa risposta qui nel caso in cui qualcuno ne abbia effettivamente bisogno. Sentiti libero di continuare a votare se ti rende felice.


2
Nel mio AppTheme ho appena inserito <item name="colorPrimary">@color/colorPrimary</item> Poi sono libero di usare l' android:background="?attr/colorPrimary"attributo nel mio widget della barra degli strumenti.
lemuel

Posso sapere come si ottiene la definizione di "@ color / material_grey_200"?
Cheok Yan Cheng

Non ricordo esattamente dove, ma qualcuno ha creato un file colors.xml basato su google.com/design/spec/style/color.html#color-color-palette non riesce a trovarlo ora però
Liminal

1
@Liminal Se usi @android:color/transparenteviti il ​​problema quando premi a lungo / fai clic su una voce di menu, c'è una casella intorno al testo. Questo lo dimostra anche in futuro se il colore dello sfondo chiaro cambia in futuro.
Ryan R

Tuttavia, non funziona quando usi CollapsingToolbarLayout.
arekolek

17

Il modo più pulito che ho trovato per farlo è creare un figlio di " ThemeOverlay.AppCompat.Dark.ActionBar ". Nell'esempio, ho impostato il colore di sfondo della barra degli strumenti su ROSSO e il colore del testo su BLU.

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

Puoi quindi applicare il tuo tema alla barra degli strumenti:

<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
mio dio era questo! textColorPrimary! Perché era così dannatamente difficile da trovare da nessuna parte
Muppet

12

Per personalizzare lo stile della barra degli strumenti, creare prima uno stile personalizzato della barra degli strumenti ereditando Widget.AppCompat.Toolbar, sovrascrivere le proprietà e quindi aggiungerlo al tema dell'app personalizzato come mostrato di seguito, vedere http://www.zoftino.com/android-toolbar-tutorial per ulteriori informazioni sulla barra degli strumenti e sugli stili.

   <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

Puoi provarlo di seguito.

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

E gli elementi di dettaglio in cui puoi trovarli https://developer.android.com/reference/android/support/v7/appcompat/R.styleable.html#Toolbar

Qui ci sono alcuni più: TextAppearance.Widget.AppCompat.Toolbar.Title, TextAppearance.Widget.AppCompat.Toolbar.Subtitle,Widget.AppCompat.Toolbar.Button.Navigation .

Spero che questo possa aiutarti.


1
Sì. Con quelli posso arrivare fino a ottenere il colore di sfondo giusto e finalmente ho capito come ottenere i colori del titolo giusti. Tuttavia la cosa killer in questo momento è che non riesco a capire dove il pulsante di overflow ottiene il suo colore. Non importa cosa cambio, rimane così scuro che non si vede contro la mia barra delle azioni oscura. Se cambio il tema in scuro, allora è chiaro e si presenta bene.Tuttavia, non importa quanto mi sposti in giro, non riesco a capire come far apparire chiara l'icona di overflow quando ho iniziato con un tema chiaro
Liminal

0

Simile a quello di Arnav Rao, ma con un genitore diverso:

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

Con questo approccio, l'aspetto della barra degli strumenti è completamente definito negli stili dell'app, quindi non è necessario posizionare alcuno stile su ciascuna barra degli strumenti.


2
In realtà android:toolbarStyleè API 21+ per android.widget.Toolbar. toolbarStyleè AppCompat per android.support.v7.widget.Toolbar.
Eugen Pechanec

Pensavo che Android Studio mi stesse dando un problema con esso, ma in un secondo test hai ragione! Questa è un'ottima notizia: sono stato in grado di abbassare di nuovo il mio minSDK a 19 e sembra che la mia toolbarStyle funzioni ancora bene! Grazie!
craigmj

Appena notato! C'è ancora l'incomprensione tra stili e temi . MyToolbarlo stile non dovrebbe estendersi Widget.AppCompat.Toolbara un tema.
Eugen Pechanec
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.