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ů.
-
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) -
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ícollectv 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. -
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.xmlares/values-night/themes.xml). - Nastavte
AppCompatDelegate.setDefaultNightModepro použití motivu programově nebo v manifestu activity přesandroid:theme.
- Vytvořte styly pro světlý a tmavý motiv (například
Použití motivu často vyžaduje znovuvytvoření Activity, aby se zdroje správně načetly. K tomu lze použít recreate().