Sobes.tech
Middle

Cum se salvează și se aplică setările de temă într-o aplicație Android?

sobes.tech AI

Răspuns de la AI

Pentru a salva și aplica setările temei într-o aplicație Android, se pot folosi mai multe abordări.

  1. SharedPreferences: O metodă simplă pentru a salva o cantitate mică de date, cum ar fi identificatorul temei selectate.

    // Salvarea temei
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Citirea temei
    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
    
    // Aplicarea temei în Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: O metodă mai modernă și asincronă pentru salvarea datelor, care oferă fluxuri de date și o stocare mai fiabilă.

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

    Aplicarea temei în Activity poate avea loc după obținerea valorii din DataStore (de exemplu, folosind collect într-o coroutine) și apelând setTheme. Este posibil să fie necesară recrearea Activity-ului după schimbarea temei pentru a se încărca corect resursele.

  3. Setările sistemului pentru temă: Android oferă, de asemenea, suport încorporat pentru teme: luminoasă, întunecată și implicită (urmând setările sistemului). Acest lucru poate fi implementat prin resurse.

    • Crearea stilurilor pentru tema luminoasă și întunecată (de exemplu, res/values/themes.xml și res/values-night/themes.xml).
    • Setarea AppCompatDelegate.setDefaultNightMode pentru a aplica tema programatic sau în manifestul activity-ului prin android:theme.

Aplicarea unei teme necesită adesea recrearea Activity-ului pentru ca resursele să fie încărcate corect. Pentru aceasta, se poate folosi recreate().