Sobes.tech
Middle

Wie speichert und wendet man die Theme-Einstellungen in einer Android-App an?

sobes.tech KI

Antwort von AI

Um die Theme-Einstellungen in einer Android-Anwendung zu speichern und anzuwenden, können verschiedene Ansätze verwendet werden.

  1. SharedPreferences: Ein einfacher Weg, um kleine Datenmengen wie die ID des gewählten Themas zu speichern.

    // Thema speichern
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Thema lesen
    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 in der Activity anwenden
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Ein moderner und asynchroner Weg, Daten zu speichern, der Datenströme und eine zuverlässigere Speicherung bietet.

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

    Die Anwendung des Themas in der Activity kann nach dem Erhalt des Wertes aus DataStore erfolgen (z.B. mit collect in einer Coroutine) und durch Aufruf von setTheme. Es kann notwendig sein, die Activity neu zu erstellen, um das korrekte Laden der Ressourcen sicherzustellen.

  3. Systemeinstellungen für das Thema: Android bietet auch eine integrierte Unterstützung für Themen: hell, dunkel und Standard (folgt den Systemeinstellungen). Dies kann durch Ressourcen umgesetzt werden.

    • Erstellen von Styles für helle und dunkle Themen (z.B. res/values/themes.xml und res/values-night/themes.xml).
    • Konfigurieren von AppCompatDelegate.setDefaultNightMode, um das Thema programmatisch anzuwenden, oder im Manifest der Activity mittels android:theme.

Das Anwenden eines Themas erfordert oft das Neuerstellen der Activity, damit die Ressourcen korrekt geladen werden. Dafür kann recreate() verwendet werden.