Implémenter le thème sombre

Essayer Compose
Jetpack Compose est le kit d'outils d'UI recommandé pour Android. Découvrez comment utiliser la thématisation dans Compose.

Figure 1. le thème sombre.

Le thème sombre est disponible sur Android 10 (niveau d'API 29) ou version ultérieure. Il présente les avantages suivants :

  • Réduit considérablement la consommation d'énergie de l'appareil, d'écran.
  • Il améliore la visibilité pour les utilisateurs souffrant d'une déficience visuelle et ceux sensibles à la lumière vive.
  • Facilite l'utilisation d'un appareil dans des conditions de faible luminosité.

Le thème sombre s'applique à l'interface utilisateur du système Android et aux applications exécutées sur l'appareil.

Vous pouvez activer le thème sombre de trois manières différentes sous Android 10 ou version ultérieure:

  • Utilisez le paramètre système en accédant à Paramètres > Affichage > Thème pour activer le thème sombre.
  • Utilisez la tuile "Réglages rapides" pour changer de thème depuis la barre des notifications, si elle est activée.
  • Sur les appareils Pixel, activez le mode Économiseur de batterie pour activer simultanément le thème sombre en temps réel. Il est possible que d'autres appareils ne soient pas compatibles avec ce comportement.

Pour savoir comment appliquer un thème sombre à du contenu Web à l'aide d'un composant WebView, consultez Assombrir le contenu Web dans WebView.

Prendre en charge le thème sombre dans votre application

Pour prendre en charge le thème sombre, définissez le thème de votre application (généralement dans res/values/styles.xml) pour qu'il hérite d'un thème DayNight :

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

Vous pouvez également utiliser le composant Material Components dark thème:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

Cela associe le thème principal de l'application aux indicateurs de mode Nuit contrôlés par le système et attribue à l'application un thème sombre par défaut lorsqu'il est activé.

Thèmes et styles

Évitez d'utiliser des couleurs ou des icônes codées en dur destinées à un thème clair. Utilisez des attributs de thème ou des ressources qualifiées la nuit.

Deux attributs de thème sont les plus importants pour le thème sombre :

  • ?android:attr/textColorPrimary : couleur de texte à usage général. Il est presque noir dans le thème clair et presque blanc dans les thèmes sombres. Il contient un état désactivé.
  • ?attr/colorControlNormal : couleur d'icône à usage général. Il contient un état désactivé.

Nous vous recommandons d'utiliser les composants Material Design, car leur système de thématisation des couleurs, comme les attributs de thème ?attr/colorSurface et ?attr/colorOnSurface, permet d'accéder facilement aux couleurs appropriées. Vous pouvez personnaliser ces attributs dans votre thème.

Modifier les thèmes dans l'application

Vous pouvez autoriser les utilisateurs à modifier le thème de l'application pendant son exécution. Voici les options recommandées :

  • Léger
  • Sombre
  • Paramètre système par défaut (option par défaut recommandée)

Ces options correspondent directement aux modes AppCompat.DayNight :

Pour changer de thème, procédez comme suit:

Forcer le mode sombre

Android 10 fournit Forcer le mode sombre, une fonctionnalité permettant aux développeurs d'implémenter rapidement un thème sombre sans définir explicitement un thème DayNight.

Forcer le thème sombre analyse chaque vue de votre application au thème clair et applique automatiquement un thème sombre avant qu'il ne soit affiché à l'écran. Vous pouvez combiner Force Dark et l'implémentation native afin de réduire le temps nécessaire pour implémenter le dark web d'un thème.

Les applications doivent activer le mode Forcer le mode sombre en définissant android:forceDarkAllowed="true" dans le thème de l'activité. Cet attribut est défini sur tous les thèmes clairs fournis par le système et AndroidX, tels que Theme.Material.Light. Lorsque vous utilisez la fonctionnalité Forcer le mode sombre, testez votre application de manière approfondie et excluez les vues si nécessaire.

Si votre application utilise un thème sombre tel que Theme.Material), le mode sombre n'est pas appliquée. De même, si le thème de votre application hérite d'un thème DayNight, Le mode sombre n'est pas appliqué en raison du changement automatique de thème.

Désactiver l'option "Forcer le mode sombre" sur une vue

L'option "Forcer le mode sombre" peut être contrôlée dans certaines vues à l'aide de la Attribut de mise en page android:forceDarkAllowed ou avec setForceDarkAllowed()

Contenu Web

Pour plus d'informations sur l'utilisation des thèmes sombres dans le contenu Web, consultez Assombrir le Web dans WebView. Pour voir un exemple de thème sombre appliqué à une WebView, consultez la démo WebView sur GitHub.

Bonnes pratiques

Les sections suivantes décrivent les bonnes pratiques à suivre pour implémenter des thèmes sombres.

Notifications et widgets

Pour les surfaces d'interface utilisateur que vous affichez sur l'appareil, mais que vous ne contrôlez pas directement, assurez-vous que les vues que vous utilisez reflètent le thème de l'application hôte. Les notifications et les widgets du lanceur d'applications en sont deux exemples.

Notifications

Utilisez les modèles de notification fournis par le système, tels que MessagingStyle. Ce signifie que le système est chargé d'appliquer le bon style d'affichage.

Widgets et vues de notifications personnalisées

Pour les widgets du lanceur d'applications ou si votre application utilise des vues de contenu de notification personnalisées, testez le contenu à la fois avec les thèmes clair et sombre.

Voici quelques pièges courants à éviter:

  • En supposant que la couleur d'arrière-plan est toujours claire.
  • Coder en dur les couleurs du texte
  • Définir une couleur d'arrière-plan codée en dur tout en utilisant la couleur de texte par défaut.
  • Utiliser une icône drawable de couleur statique.

Dans tous ces cas, utilisez des attributs de thème appropriés au lieu de couleurs codées en dur.

Écrans de lancement

Si votre application dispose d'un écran de lancement personnalisé, vous devrez peut-être le modifier pour qu'il reflète le thème sélectionné.

Supprimez toutes les couleurs codées en dur, telles que les couleurs d'arrière-plan définies par programmation blanc. Utilisez plutôt l'attribut de thème ?android:attr/colorBackground.

Modifications de configuration

Lorsque le thème de l'application change, que ce soit par le biais des paramètres système ou d'AppCompat, déclenche un uiMode modification de configuration. Cela signifie que les activités sont automatiquement recréées.

Dans certains cas, vous souhaiterez peut-être qu'une application gère le changement de configuration. Par exemple, vous pouvez retarder une modification de configuration si une vidéo est en cours de lecture.

Une application peut gérer l'implémentation du thème sombre en déclarant chaque Activity peut gérer le changement de configuration de uiMode:

<activity
    android:name=".MyActivity"
    android:configChanges="uiMode" />

Lorsqu'une Activity déclare qu'elle gère les modifications de configuration, sa méthode onConfigurationChanged() est appelée en cas de changement de thème.

Pour vérifier le thème actuel, les applications peuvent exécuter du code comme suit:

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme.
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme.
}
int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
    case Configuration.UI_MODE_NIGHT_NO:
        // Night mode is not active, we're using the light theme
        break;
    case Configuration.UI_MODE_NIGHT_YES:
        // Night mode is active, we're using dark theme
        break;
}