Sobes.tech
Middle

Πώς αποθηκεύετε και εφαρμόζετε τις ρυθμίσεις θέματος σε μια εφαρμογή Android;

sobes.tech AI

Απάντηση από AI

Για την αποθήκευση και εφαρμογή των ρυθμίσεων θέματος σε μια εφαρμογή Android, μπορούν να χρησιμοποιηθούν διάφορες προσεγγίσεις.

  1. SharedPreferences: Απλός τρόπος για την αποθήκευση μικρής ποσότητας δεδομένων, όπως το αναγνωριστικό του επιλεγμένου θέματος.

    // Αποθήκευση θέματος
    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putInt(getString(R.string.saved_theme_key), themeId)
        apply()
    }
    
    // Ανάγνωση θέματος
    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
    
    // Εφαρμογή θέματος στην Activity
    setTheme(savedThemeId)
    super.onCreate(savedInstanceState)
    
  2. DataStore: Μοντέρνος και ασύγχρονος τρόπος αποθήκευσης δεδομένων, που προσφέρει ροές δεδομένων και πιο αξιόπιστη αποθήκευση.

    // DataStore
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
    
    // Αποθήκευση θέματος
    suspend fun saveTheme(themeId: Int) {
        dataStore.edit { settings ->
            settings[intPreferencesKey("theme_id")] = themeId
        }
    }
    
    // Ανάκτηση θέματος
    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
        }
    

    Η εφαρμογή του θέματος στην Activity μπορεί να γίνει μετά την λήψη της τιμής από το DataStore (π.χ., με collect σε μια coroutine) και την κλήση setTheme. Ίσως χρειαστεί να αναδημιουργηθεί η Activity μετά την αλλαγή του θέματος για σωστή φόρτωση των πόρων.

  3. Ρυθμίσεις συστήματος για το θέμα: Το Android παρέχει επίσης ενσωματωμένη υποστήριξη θεμάτων: φωτεινό, σκοτεινό και προεπιλεγμένο (ακολουθεί τις ρυθμίσεις συστήματος). Αυτό μπορεί να υλοποιηθεί μέσω πόρων.

    • Δημιουργήστε στυλ για φωτεινό και σκοτεινό θέμα (π.χ., res/values/themes.xml και res/values-night/themes.xml).
    • Ρυθμίστε το AppCompatDelegate.setDefaultNightMode για εφαρμογή του θέματος προγραμματιστικά ή στο μανιφέστο της δραστηριότητας μέσω android:theme.

Η εφαρμογή ενός θέματος συχνά απαιτεί την αναδημιουργία της Activity ώστε οι πόροι να φορτώνονται σωστά. Για αυτό, μπορείτε να χρησιμοποιήσετε το recreate().