Sobes.tech
Middle

Hoe sla je thema-instellingen op en pas je ze toe in een Android-app?

sobes.tech AI

Antwoord van AI

Om de thema-instellingen op te slaan en toe te passen in een Android-app, kunnen verschillende benaderingen worden gebruikt.

  1. SharedPreferences: Een eenvoudige manier om kleine hoeveelheden gegevens op te slaan, zoals de ID van het geselecteerde thema.

    // Thema opslaan
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Thema lezen
    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
    
    // Thema toepassen in Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Een modernere en asynchrone manier om gegevens op te slaan, die datastromen en betrouwbaarder opslag biedt.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Thema opslaan
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Thema ophalen
    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
        }
    

    Het toepassen van het thema in de Activity kan gebeuren nadat de waarde uit DataStore is verkregen (bijvoorbeeld met collect in een coroutine) en door setTheme aan te roepen. Het kan nodig zijn om de Activity opnieuw te maken na het wijzigen van het thema, zodat de resources correct worden geladen.

  3. Systeeminstellingen voor het thema: Android biedt ook ingebouwde ondersteuning voor thema's: licht, donker en standaard (volgt de systeeminstellingen). Dit kan worden geïmplementeerd via resources.

    • Maak stijlen voor lichte en donkere thema's (bijvoorbeeld res/values/themes.xml en res/values-night/themes.xml).
    • Stel AppCompatDelegate.setDefaultNightMode in om het thema programmatisch toe te passen of in de manifest van de activity via android:theme.

Het toepassen van een thema vereist vaak het opnieuw maken van de Activity, zodat de resources correct worden geladen. Hiervoor kan recreate() worden gebruikt.