Il existe les classes Theme.AppCompat suivantes:
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
et les classes ThemeOverlay.AppCompat suivantes:
ThemeOverlay.AppCompat
ThemeOverlay.AppCompat.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar
Pourquoi voudrait-on utiliser ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light par exemple? Je vois qu'il y a beaucoup moins d'attributs définis pour ThemeOverlay - je suis curieux de savoir quel est le cas d'utilisation envisagé pour ThemeOverlay.
Par ceci article de blog de thème contre le style par le créateur d'AppCompat:
Les [ThèmeOverlays] sont des thèmes spéciaux qui recouvrent les thèmes Thème.Matériaux normaux, écrasant les attributs pertinents pour les rendre soit clairs/sombres.
ThemeOverlay + ActionBar
Les plus enthousiastes auront également vu les dérivés de ActionBar ThemeOverlay:
ThemeOverlay.Material.Light.ActionBar
ThemeOverlay.Material.Dark.ActionBar
Celles-ci ne doivent être utilisées avec la barre d'action via le nouvel attribut
actionBarTheme
, ou définies directement dans votre barre d'outils.La seule chose que ceux-ci font actuellement différemment à leurs parents est qu'ils changent le
colorControlNormal
enAndroid:textColorPrimary
_, rendant ainsi le texte et les icônes opaques.
Theme.AppCompat est utilisé pour définir le thème global de l'application entière. ThemeOverlay.AppCompat est utilisé pour remplacer (ou "superposer") ce thème pour des vues spécifiques, notamment la barre d'outils.
Regardons un exemple pour expliquer pourquoi cela est nécessaire.
Le ActionBar est normalement affiché dans une application. Je peux choisir sa couleur en définissant la valeur colorPrimary
. Cependant, changer le thème change la couleur du texte sur la barre d'actions.
<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 utilisant une couleur de texte claire dans la barre d'action car le texte noir est difficile à lire.
L’utilisation de Theme.AppCompat plutôt que de Theme.Material a pour objectif de permettre aux anciennes versions de Android d’utiliser notre thème de conception de matériel. Le problème est que les anciennes versions de Android ne supporte pas le ActionBar. Ainsi, la documentation recommande de masquer le ActionBar et d’ajouter une barre d’outils à votre présentation. Pour masquer le ActionBar, nous devons utiliser l’un des NoActionBar
themes.Les images suivantes montrent la barre d’outils avec le ActionBar masqué.
Mais que se passe-t-il si je veux quelque chose comme un thème Light avec une DarkActionBar? Depuis que je dois utiliser NoActionBar, ce n'est pas une option.
C'est ici que ThemeOverlay entre en jeu. Je peux spécifier le thème Dark ActionBar dans la présentation xml de la barre d'outils.
<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.
Theme.AppCompat.Light.NoActionBar
ThemeOverlay.AppCompat.Dark.ActionBar
Si vous souhaitez que le menu contextuel soit léger, vous pouvez ajouter ceci:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
J'ai appris cela par l'expérimentation et par la lecture des articles suivants.