Sobes.tech
Middle

Come salvare e applicare le impostazioni del tema in un'app Android?

sobes.tech AI

Risposta dell'AI

Per salvare e applicare le impostazioni del tema in un'app Android, si possono usare diversi approcci.

  1. SharedPreferences: Metodo semplice per salvare piccole quantità di dati, come l'identificatore del tema selezionato.

    // Salvataggio del tema
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Lettura del tema
    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
    
    // Applicare il tema in Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Metodo più moderno e asincrono per salvare dati, che offre flussi di dati e uno storage più affidabile.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Salvataggio del tema
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Lettura del tema
    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'applicazione del tema in Activity può avvenire dopo aver ottenuto il valore da DataStore (ad esempio, usando collect in una coroutine) e chiamando setTheme. Potrebbe essere necessario ricreare l'Activity dopo aver cambiato il tema per il corretto caricamento delle risorse.

  3. Impostazioni di sistema per il tema: Android offre anche il supporto integrato per i temi: chiaro, scuro e predefinito (segue le impostazioni di sistema). Questo può essere implementato tramite risorse.

    • Creare stili per i temi chiaro e scuro (ad esempio, res/values/themes.xml e res/values-night/themes.xml).
    • Configurare AppCompatDelegate.setDefaultNightMode per applicare il tema programmaticamente o nel manifesto dell'activity tramite android:theme.

L'applicazione di un tema spesso richiede di ricreare l'Activity affinché le risorse siano caricate correttamente. Per farlo, si può usare recreate().