Sobes.tech
Middle

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

sobes.tech AI

Отговор от AI

За запазване и прилагане на настройките на темата в Android приложение могат да се използват няколко подхода.

  1. SharedPreferences: Прост начин за запазване на малък обем данни, като идентификатор на избраната тема.

    // Запазване на тема
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Четене на тема
    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
    
    // Прилагане на тема в Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: По-съвременен и асинхронен начин за запазване на данни, който предлага потоци от данни и по-надеждно съхранение.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Запазване на тема
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Получаване на тема
    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
        }
    

    Прилагането на тема в Activity може да се случи след получаване на стойността от DataStore (например, с използване на collect в корутина) и извикване на setTheme. Може да е необходимо да се пресъздаде Activity след промяна на темата за правилно показване.

  3. Системни настройки на темата: Android също така предоставя вградена поддръжка за теми: светла, тъмна и по подразбиране (следва системните настройки). Това може да се реализира чрез ресурси.

    • Създаване на стилове за светла и тъмна тема (например, res/values/themes.xml и res/values-night/themes.xml).
    • Настройване на AppCompatDelegate.setDefaultNightMode за прилагане на темата програмно или конфигуриране в манифеста на activity чрез android:theme.

Прилагането на тема често изисква пресъздаване на Activity, за да бъдат правилно заредени ресурсите. За това може да се използва recreate().