Sobes.tech
Middle

Jak ukládat a používat nastavení motivu v aplikaci Android?

sobes.tech AI

Odpověď od AI

Pro ukládání a použití nastavení motivu v aplikaci Android lze použít několik přístupů.

  1. SharedPreferences: Jednoduchý způsob, jak uložit malé množství dat, například identifikátor vybraného motivu.

    // Uložení motivu
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Čtení motivu
    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
    
    // Použití motivu v Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Modernější a asynchronní způsob ukládání dat, který nabízí datové proudy a spolehlivější ukládání.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Uložení motivu
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Získání motivu
    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
        }
    

    Použití motivu v Activity může probíhat po získání hodnoty z DataStore (například pomocí collect v coroutine) a volání setTheme. Po změně motivu může být nutné Activity znovu vytvořit, aby se správně načetly zdroje.

  3. Systémové nastavení motivu: Android také nabízí vestavěnou podporu motivů: světlý, tmavý a výchozí (následuje systémová nastavení). To lze implementovat přes zdroje.

    • Vytvořte styly pro světlý a tmavý motiv (například res/values/themes.xml a res/values-night/themes.xml).
    • Nastavte AppCompatDelegate.setDefaultNightMode pro použití motivu programově nebo v manifestu activity přes android:theme.

Použití motivu často vyžaduje znovuvytvoření Activity, aby se zdroje správně načetly. K tomu lze použít recreate().