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.
-
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() -
Thema beim Start anwenden: Lesen Sie den gespeicherten Wert in der Haupt-
Activityoder in derApplication-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) } -
Benutzeränderung des Themas: Bieten Sie eine Benutzeroberfläche (z.B.
RadioButtonin den Einstellungen), in der der Benutzer ein Thema auswählen kann. Beim Auswählen speichern Sie die neue ID inSharedPreferencesund wenden das Thema sofort an, indem SieAppCompatDelegate.setDefaultNightMode()aufrufen und ggf. dieActivityneu 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.
-
Themen in
styles.xmldefinieren: Definieren Sie Stile für helle und dunkle Themen inres/values/styles.xmlundres/values-night/styles.xmlund erben Sie von den ThemenTheme.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>
```
-
Änderungen des Themas überwachen: Bei Änderungen im System (z.B. nach Zeitplan oder manuell durch den Nutzer in den Telefoneinstellungen) können Sie
Configuration.uiModeinonConfigurationChanged()verwenden, um darauf zu reagieren.AppCompatDelegatehandhabt dies jedoch normalerweise automatisch bei Verwendung vonMODE_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.