Sobes.tech
Middle

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ść.

  1. 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)
    
  2. 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ą collect w coroutine) i wywołaniu setTheme. Może być konieczne ponowne utworzenie Activity po zmianie motywu, aby zasoby zostały poprawnie załadowane.

  3. 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.xml i res/values-night/themes.xml).
    • Konfiguracja AppCompatDelegate.setDefaultNightMode, aby zastosować motyw programowo lub w manifeście activity za pomocą android:theme.

Zastosowanie motywu często wymaga ponownego utworzenia Activity, aby zasoby zostały poprawnie załadowane. Do tego można użyć recreate().