Jak zapisywać i stosować ustawienia motywu w aplikacji Android?
sobes.tech AI
Odpowiedź od AI
Aby zapisać i zastosować ustawienia motywu w aplikacji Android, można użyć kilku podejść.
-
SharedPreferences: Prosty sposób na zapisanie niewielkiej ilości danych, takich jak identyfikator wybranego motywu.// Zapisywanie motywu val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return with (sharedPref.edit()) { putInt(getString(R.string.saved_theme_key), themeId) apply() } // Odczyt motywu 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 // Zastosowanie motywu w Activity setTheme(savedThemeId) super.onCreate(savedInstanceState) -
DataStore: Nowszy i asynchroniczny sposób na zapisywanie danych, oferujący strumienie danych i bardziej niezawodne przechowywanie.// DataStore private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings") // Zapisywanie motywu suspend fun saveTheme(themeId: Int) { dataStore.edit { settings -> settings[intPreferencesKey("theme_id")] = themeId } } // Odczyt motywu 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 }Zastosowanie motywu w Activity może nastąpić po uzyskaniu wartości z
DataStore(np. za pomocącollectw coroutine) i wywołaniusetTheme. Może być konieczne ponowne utworzenie Activity po zmianie motywu, aby zasoby zostały poprawnie załadowane. -
Ustawienia systemowe dla motywu: Android oferuje również wbudowane wsparcie dla motywów: jasny, ciemny i domyślny (podąża za ustawieniami systemu). Można to zaimplementować za pomocą zasobów.
- Tworzenie stylów dla jasnego i ciemnego motywu (np.
res/values/themes.xmlires/values-night/themes.xml). - Konfiguracja
AppCompatDelegate.setDefaultNightMode, aby zastosować motyw programowo lub w manifeście activity za pomocąandroid:theme.
- Tworzenie stylów dla jasnego i ciemnego motywu (np.
Zastosowanie motywu często wymaga ponownego utworzenia Activity, aby zasoby zostały poprawnie załadowane. Do tego można użyć recreate().