Sobes.tech
Middle

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

sobes.tech IA

Réponse de l'IA

Pour sauvegarder et appliquer les paramètres du thème dans une application Android, plusieurs approches peuvent être utilisées.

  1. SharedPreferences : Méthode simple pour sauvegarder une petite quantité de données, comme l'identifiant du thème sélectionné.

    // Sauvegarder le thème
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Lire le thème
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
    val defaultValue = resources.getInteger(R.integer.default_theme_id)
    val savedThemeId = sharedPref?.getInt(getString(R.string.saved_theme_key), defaultValue) ?: defaultValue
    
    // Appliquer le thème dans l'Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore : Méthode plus moderne et asynchrone pour sauvegarder des données, offrant des flux de données et un stockage plus fiable.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Sauvegarder le thème
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Obtenir le thème
    val themeFlow: Flow<Int> = dataStore.data
        .catch { exception ->
            if (exception is IOException) {
                emit(emptyPreferences())
            } else {
                throw exception
            }
        }
        .map { preferences ->
            preferences[intPreferencesKey("theme_id")] ?: R.style.Theme_App
        }
    

    L'application du thème dans l'Activity peut se faire après avoir obtenu la valeur de DataStore (par exemple, en utilisant collect dans une coroutine) et en appelant setTheme. Il peut être nécessaire de recréer l'Activity après avoir changé le thème pour que les ressources soient correctement chargées.

  3. Paramètres système pour le thème : Android offre également un support intégré pour les thèmes : clair, sombre et par défaut (qui suit les paramètres du système). Cela peut être implémenté via des ressources.

    • Créer des styles pour les thèmes clair et sombre (par exemple, res/values/themes.xml et res/values-night/themes.xml).
    • Configurer AppCompatDelegate.setDefaultNightMode pour appliquer le thème de manière programmatique ou dans le manifeste de l'activité via android:theme.

L'application d'un thème nécessite souvent de recréer l'Activity pour que les ressources soient chargées correctement. Pour cela, on peut utiliser recreate().