web-dev-qa-db-fra.com

Quand faut-il utiliser Theme.AppCompat vs ThemeOverlay.AppCompat?

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.

102
Brendan Weinstein

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 en Android:textColorPrimary _, rendant ainsi le texte et les icônes opaques.

66
ianhanniballake

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.

Thèmes d'applications avec une barre d'actions

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>

enter image description here

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

Masquer la barre d'actions et utiliser une barre d'outils

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

enter image description here

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.

Remplacer le thème de l'application

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.

enter image description here

  • Thème de l'application: Theme.AppCompat.Light.NoActionBar
  • Thème de la barre d'outils: ThemeOverlay.AppCompat.Dark.ActionBar

Si vous souhaitez 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 par la lecture des articles suivants.

136
Suragch