Theme.AppCompat est utilisé pour définir le thème global pour l'ensemble de l'application. ThemeOverlay.AppCompat est utilisé pour remplacer (ou "superposer") ce thème pour des vues spécifiques, en particulier la barre d'outils.
Regardons un exemple pour expliquer pourquoi cela est nécessaire.
Thèmes d'application avec une ActionBar
L'ActionBar est normalement affichée dans une application. Je peux choisir sa couleur en définissant la colorPrimary
valeur. Cependant, la modification du thème modifie la couleur du texte sur l'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>
Étant donné que ma couleur principale est le bleu foncé, je devrais probablement utiliser l'un des thèmes qui utilise une couleur de texte claire dans la barre d'action car le texte noir est difficile à lire.
Masquer l'ActionBar et utiliser une barre d'outils
L'intérêt d'utiliser Theme.AppCompat plutôt que Theme.Material est de permettre aux anciennes versions d'Android d'utiliser notre thème de conception matérielle. Le problème est que les anciennes versions d'Android ne prennent pas en charge l'ActionBar. Ainsi, la documentation recommande de masquer l'ActionBar et d'ajouter une barre d'outils à votre mise en page. Pour masquer l'ActionBar, nous devons utiliser l'un des NoActionBar
thèmes. Les images suivantes montrent la barre d'outils avec l'ActionBar masquée.
Mais que faire si je veux quelque chose comme un thème Light avec un DarkActionBar? Puisque je dois utiliser NoActionBar, ce n'est pas une option.
Remplacer le thème de l'application
Voici où ThemeOverlay entre en jeu. Je peux spécifier le thème Dark ActionBar dans ma mise en page XML Toolbar.
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
Cela nous permet enfin d'avoir l'effet que nous voulons. Le thème Dark.ActionBar recouvre le thème de l'application Light pour cette occasion particulière.
- Thème de l'application:
Theme.AppCompat.Light.NoActionBar
- Thème de la barre d'outils:
ThemeOverlay.AppCompat.Dark.ActionBar
Si vous voulez que le menu contextuel soit léger, vous pouvez ajouter ceci:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Une étude plus approfondie
J'ai appris cela par l'expérimentation et en lisant les articles suivants.