Sobes.tech
Junior

Как да запазите и използвате настройките на темата в приложение за Android?

sobes.tech AI

Отговор от AI

Ефективният подход включва използването на SharedPreferences за запазване на избраната тема и AppCompatDelegate.setDefaultNightMode() за прилагането й.

  1. Запазване на темата: Използвайте 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()
    
  2. Прилагане на темата при стартиране: В главния 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)
    }
    
  3. Промяна на темата от потребителя: Предоставете потребителски интерфейс (например, 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 с новата тема.

  4. Определяне на теми в 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>
    
  5. Следене на промени в темата: В случай, че темата се променя системно (например, по график или ръчно от потребителя чрез настройките на телефона), може да използвате 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, тъй като осигурява обратна съвместимост и правилна работа с различните компоненти на библиотеката за поддръжка.