Sobes.tech
Junior

Comment enregistrer et utiliser les paramètres du thème dans une application Android?

sobes.tech IA

Réponse de l'IA

Une approche efficace inclut l'utilisation de SharedPreferences pour sauvegarder le thème sélectionné et AppCompatDelegate.setDefaultNightMode() pour l'appliquer.

  1. Sauvegarder le thème : Utilisez SharedPreferences pour stocker l'identifiant du thème choisi (par exemple, "light", "dark", "system").

    // Obtenir SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Obtenir l'éditeur
    val editor = sharedPrefs.edit()
    // Appliquer le thème avec ID themeId
    editor.putString("current_theme", themeId)
    // Enregistrer les modifications
    editor.apply()
    
  2. Appliquer le thème au démarrage : Dans la Activity principale ou dans la classe Application, lisez la valeur sauvegardée dans SharedPreferences et appliquez le thème.

    // Lire la valeur sauvegardée du thème
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Par défaut 'system'
    
    // Appliquer le thème
    when (themeId) {
        "light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
        "dark" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
        "system" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
        else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    }
    
  3. Changement de thème par l'utilisateur : Fournissez une interface utilisateur (par exemple, RadioButton dans les paramètres), où l'utilisateur peut choisir un thème. Lors de la sélection, enregistrez le nouvel identifiant dans SharedPreferences et appliquez immédiatement le thème en appelant AppCompatDelegate.setDefaultNightMode(), et si nécessaire, redémarrez l'Activity pour une application correcte du thème.

    // Supposons que l'utilisateur a choisi le thème sombre
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Appliquer le thème immédiatement
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Ou utiliser recreate() pour appliquer complètement le thème
    // recreate()
    

Redémarrer l'Activity avec recreate() peut être nécessaire pour que toutes les vues dans l'Activity actuelle soient correctement redessinées avec le nouveau thème.

  1. Définition des thèmes dans styles.xml : Définissez des styles pour les thèmes clair et sombre dans res/values/styles.xml et res/values-night/styles.xml respectivement, en héritant des thèmes Theme.AppCompat.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Définitions de styles pour le thème clair -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Définitions de styles pour le thème sombre -->
    </style>
    

Dans le AndroidManifest.xml, indiquez le thème de base de l'application :

```xml
<!-- AndroidManifest.xml -->
<application
    android:theme="@style/AppTheme.Light"
    ...>
    <!-- ... Activities -->
</application>
```
  1. Surveillance des changements de thème : En cas de changement de thème par le système (par exemple, selon l'horaire ou manuellement par l'utilisateur via les paramètres du téléphone), vous pouvez utiliser Configuration.uiMode dans onConfigurationChanged() pour réagir, mais AppCompatDelegate gère généralement cela automatiquement lorsque vous utilisez MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Vous pouvez vérifier le nouveau thème si nécessaire
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

L'utilisation de AppCompatDelegate est la méthode recommandée pour supporter les thèmes sur Android, car elle assure la compatibilité rétroactive et le bon fonctionnement avec différents composants de la bibliothèque de support.