Sobes.tech
Middle

Kako sačuvati i primeniti podešavanja teme u Android aplikaciji?

sobes.tech АИ

Одговор од АИ

Za sačuvanje i primenu podešavanja teme u Android aplikaciji može se koristiti nekoliko pristupa.

  1. SharedPreferences: Jednostavan način za čuvanje malog obima podataka, kao što je identifikator odabrane teme.

    // Čuvanje teme
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Čitanje teme
    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
    
    // Primena teme u Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Moderniji i asinhroni način za čuvanje podataka, koji nudi tokove podataka i pouzdanije skladištenje.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Čuvanje teme
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Dobijanje teme
    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
        }
    

    Primena teme u Activity može se desiti nakon dobijanja vrednosti iz DataStore (npr. korišćenjem collect u korutini) i poziva setTheme. Može biti potrebno da se Activity ponovo kreira nakon promene teme za ispravno prikazivanje.

  3. Sistemske postavke teme: Android takođe pruža ugrađenu podršku za teme: svetlu, tamnu i podrazumevanu (koja prati sistemske postavke). To se može implementirati putem resursa.

    • Kreiranje stilova za svetlu i tamnu temu (npr. res/values/themes.xml i res/values-night/themes.xml).
    • Podešavanje AppCompatDelegate.setDefaultNightMode za primenu teme programatski ili podešavanje u manifestu activity-ja putem android:theme.

Primena teme često zahteva ponovno kreiranje Activity-ja kako bi resursi bili pravilno učitani. Za to se može koristiti recreate().