Quando si dovrebbe usare Theme.AppCompat vs ThemeOverlay.AppCompat?


113

Sono disponibili le seguenti classi 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

e le seguenti classi ThemeOverlay.AppCompat:

ThemeOverlay.AppCompat
ThemeOverlay.AppCompat.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar

Perché si dovrebbe usare ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light, ad esempio? Vedo che ci sono molti meno attributi definiti per ThemeOverlay - Sono curioso di quale sia il caso d'uso previsto per ThemeOverlay.

Risposte:


71

Per questo post sul blog Theme vs Style del creatore di AppCompat:

[ThemeOverlays] sono temi speciali che si sovrappongono ai normali temi Theme.Material, sovrascrivendo gli attributi rilevanti per renderli chiari / scuri.

ThemeOverlay + ActionBar

Gli occhi più attenti di voi avranno anche visto i derivati ​​di ActionBar ThemeOverlay:

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

Questi dovrebbero essere usati solo con la barra delle azioni tramite il nuovo actionBarTheme attributo o impostati direttamente sulla barra degli strumenti.

L'unica cosa che questi fanno attualmente in modo diverso dai loro genitori è che cambiano colorControlNormalin essere android:textColorPrimary, rendendo così il testo e le icone opachi.


155

Theme.AppCompat viene utilizzato per impostare il tema globale per l'intera app. ThemeOverlay.AppCompat viene utilizzato per sovrascrivere (o "sovrapporre") quel tema per visualizzazioni specifiche, in particolare la barra degli strumenti.

Diamo un'occhiata a un esempio del motivo per cui è necessario.

Temi delle app con una ActionBar

La ActionBar viene normalmente mostrata in un'app. Posso scegliere il suo colore impostando il colorPrimaryvalore. Tuttavia, la modifica del tema cambia il colore del testo sulla ActionBar.

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

inserisci qui la descrizione dell'immagine

Poiché il mio colore principale è il blu scuro, probabilmente dovrei usare uno dei temi che utilizza un colore del testo chiaro nella barra delle azioni perché il testo nero è difficile da leggere.

Nascondere la ActionBar e utilizzare una barra degli strumenti

Il punto centrale dell'utilizzo di Theme.AppCompat piuttosto che Theme.Material è che possiamo consentire alle versioni precedenti di Android di utilizzare il nostro tema di material design. Il problema è che le versioni precedenti di Android non supportano ActionBar. Pertanto, la documentazione consiglia di nascondere la ActionBar e di aggiungere una barra degli strumenti al layout. Per nascondere la ActionBar dobbiamo usare uno dei NoActionBartemi. Le immagini seguenti mostrano la barra degli strumenti con la ActionBar nascosta.

inserisci qui la descrizione dell'immagine

Ma cosa succede se voglio qualcosa come un tema Light con DarkActionBar? Dato che devo usare NoActionBar, questa non è un'opzione.

Sostituzione del tema dell'app

È qui che entra in gioco ThemeOverlay. Posso specificare il tema Dark ActionBar nel mio layout xml della barra degli strumenti.

<android.support.v7.widget.Toolbar
    ...
    android:background="?attr/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

Questo ci permette finalmente di avere l'effetto che vogliamo. Il tema Dark.ActionBar si sovrappone al tema dell'app Light per questa particolare occasione.

inserisci qui la descrizione dell'immagine

  • Tema dell'app: Theme.AppCompat.Light.NoActionBar
  • Tema della barra degli strumenti: ThemeOverlay.AppCompat.Dark.ActionBar

Se desideri che il menu popup sia leggero, puoi aggiungere questo:

app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

Ulteriori studi

L'ho imparato attraverso la sperimentazione e leggendo i seguenti articoli.


Come rendere trasparente la barra di stato quando si utilizza Themeoverlay?
gegobyte

Mi chiedo come ottenere questo risultato con la nuova MaterialToolbar
David

@David, attualmente lavoro principalmente con Flutter, quindi non ho tenuto il passo con i nuovi sviluppi di Android. Se trovi la risposta, non esitare a tornare qui e lasciare un commento, modificare la mia risposta o aggiungere la tua risposta.
Suragch
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.