Как да запазите и използвате настройките на темата в приложение за Android?
sobes.tech AI
Отговор от AI
Ефективният подход включва използването на SharedPreferences за запазване на избраната тема и AppCompatDelegate.setDefaultNightMode() за прилагането й.
-
Запазване на темата: Използвайте
SharedPreferencesза съхраняване на идентификатора на избраната тема (например, "light", "dark", "system").// Получаване на SharedPreferences val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE) // Получаване на редактор val editor = sharedPrefs.edit() // Прилагане на тема с ID themeId editor.putString("current_theme", themeId) // Запазване на промените editor.apply() -
Прилагане на темата при стартиране: В главния
ActivityилиApplicationклас, прочетете запазената стойност и приложете темата.// Четене на запазената стойност на темата val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE) .getString("current_theme", "system") // По подразбиране 'system' // Прилагане на тема 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) } -
Промяна на темата от потребителя: Предоставете потребителски интерфейс (например,
RadioButtonв настройките), където потребителят може да избере тема. При избор, запазете новия идентификатор вSharedPreferencesи незабавно приложете темата, като извикатеAppCompatDelegate.setDefaultNightMode()и, ако е необходимо, рестартирайтеActivityза правилното прилагане.// Предположим, че потребителят е избрал тъмна тема val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE) val editor = sharedPrefs.edit() editor.putString("current_theme", "dark") editor.apply() // Прилагане на темата незабавно AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) // Или recreate() за пълно прилагане на темата // recreate()Рестартирането на
Activityсrecreate()може да е необходимо, за да се прерисуват правилно всички View в текущатаActivityс новата тема. -
Определяне на теми в
styles.xml: Определете стилове за светла и тъмна тема вres/values/styles.xmlиres/values-night/styles.xmlсъответно, наследявайки отTheme.AppCompat.<!-- res/values/styles.xml --> <style name="AppTheme.Light" parent="Theme.AppCompat.Light"> <!-- Определения на стилове за светла тема --> </style> <!-- res/values-night/styles.xml --> <style name="AppTheme.Dark" parent="Theme.AppCompat"> <!-- Определения на стилове за тъмна тема --> </style>В
AndroidManifest.xmlукажете базовата тема на приложението:<!-- AndroidManifest.xml --> <application android:theme="@style/AppTheme.Light" ...> <!-- ... Activities --> </application> -
Следене на промени в темата: В случай, че темата се променя системно (например, по график или ръчно от потребителя чрез настройките на телефона), може да използвате
Configuration.uiModeвonConfigurationChanged()за реагиране, ноAppCompatDelegateобикновено го управлява автоматично при използване наMODE_NIGHT_FOLLOW_SYSTEM.@Override override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) // Може да проверите новата тема, ако е необходимо // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK // ... }
Използването на AppCompatDelegate е препоръчителният подход за поддръжка на теми в Android, тъй като осигурява обратна съвместимост и правилна работа с различните компоненти на библиотеката за поддръжка.