Sobes.tech
Junior

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

sobes.tech KI

Antwort von AI

Ein effektiver Ansatz umfasst die Verwendung von SharedPreferences zum Speichern des gewählten Themas und AppCompatDelegate.setDefaultNightMode(), um es anzuwenden.

  1. Thema speichern: Verwenden Sie SharedPreferences, um die ID des gewählten Themas zu speichern (z.B. "light", "dark", "system").

    // SharedPreferences erhalten
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Editor erhalten
    val editor = sharedPrefs.edit()
    // Thema mit ID themeId anwenden
    editor.putString("current_theme", themeId)
    // Änderungen speichern
    editor.apply()
    
  2. Thema beim Start anwenden: Lesen Sie den gespeicherten Wert in der Haupt-Activity oder in der Application-Klasse und wenden Sie das Thema an.

    // Gespeicherten Themenwert lesen
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Standard 'system'
    
    // Thema anwenden
    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. Benutzeränderung des Themas: Bieten Sie eine Benutzeroberfläche (z.B. RadioButton in den Einstellungen), in der der Benutzer ein Thema auswählen kann. Beim Auswählen speichern Sie die neue ID in SharedPreferences und wenden das Thema sofort an, indem Sie AppCompatDelegate.setDefaultNightMode() aufrufen und ggf. die Activity neu starten, um das Thema korrekt anzuwenden.

    // Angenommen, der Benutzer hat das dunkle Thema gewählt
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Thema sofort anwenden
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Oder recreate() für vollständige Anwendung des Themas
    // recreate()
    

Das Neustarten der Activity mit recreate() kann notwendig sein, damit alle Views in der aktuellen Activity korrekt mit dem neuen Thema neu gezeichnet werden.

  1. Themen in styles.xml definieren: Definieren Sie Stile für helle und dunkle Themen in res/values/styles.xml und res/values-night/styles.xml und erben Sie von den Themen Theme.AppCompat.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Stil-Definitionen für helles Thema -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Stil-Definitionen für dunkles Thema -->
    </style>
    

Im AndroidManifest.xml geben Sie das Basisthema der Anwendung an:

```xml
<!-- AndroidManifest.xml -->
<application
    android:theme="@style/AppTheme.Light"
    ...>
    <!-- ... Activities -->
</application>
```
  1. Änderungen des Themas überwachen: Bei Änderungen im System (z.B. nach Zeitplan oder manuell durch den Nutzer in den Telefoneinstellungen) können Sie Configuration.uiMode in onConfigurationChanged() verwenden, um darauf zu reagieren. AppCompatDelegate handhabt dies jedoch normalerweise automatisch bei Verwendung von MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Sie können das neue Thema überprüfen, falls erforderlich
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

Die Verwendung von AppCompatDelegate ist der empfohlene Ansatz, um Themen in Android zu unterstützen, da sie Rückwärtskompatibilität und korrektes Arbeiten mit verschiedenen Komponenten der Support-Bibliothek gewährleistet.