Sobes.tech
Junior

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

sobes.tech AI

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

Η αποτελεσματική προσέγγιση περιλαμβάνει τη χρήση του SharedPreferences για την αποθήκευση του επιλεγμένου θέματος και του AppCompatDelegate.setDefaultNightMode() για την εφαρμογή του.

  1. Αποθήκευση θέματος: Χρησιμοποιήστε το SharedPreferences για να αποθηκεύσετε τον αναγνωριστικό του επιλεγμένου θέματος (π.χ., "light", "dark", "system").

    // Λήψη SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Λήψη επεξεργαστή
    val editor = sharedPrefs.edit()
    // Εφαρμογή θέματος με ID το themeId
    editor.putString("current_theme", themeId)
    // Αποθήκευση αλλαγών
    editor.apply()
    
  2. Εφαρμογή θέματος κατά την εκκίνηση: Στην κύρια Activity ή Application κλάση, διαβάστε την αποθηκευμένη τιμή και εφαρμόστε το θέμα.

    // Ανάγνωση αποθηκευμένης τιμής θέματος
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Προεπιλογή 'system'
    
    // Εφαρμογή θέματος
    when (themeId) {
        "light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
        "dark" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
        "system" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
        else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
    }
    
  3. Αλλαγή θέματος από τον χρήστη: Παρέχετε ένα περιβάλλον χρήστη (π.χ., RadioButton στις ρυθμίσεις), όπου ο χρήστης μπορεί να επιλέξει θέμα. Κατά την επιλογή, αποθηκεύστε το νέο αναγνωριστικό και εφαρμόστε το άμεσα, καλώντας AppCompatDelegate.setDefaultNightMode() και, αν χρειάζεται, επανεκκινήστε την Activity.

    // Υποθέτοντας ότι ο χρήστης επέλεξε το σκοτεινό θέμα
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Εφαρμογή του θέματος άμεσα
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Ή recreate() για πλήρη εφαρμογή του θέματος
    // recreate()
    

    Η επανεκκίνηση της Activity με recreate() μπορεί να είναι απαραίτητη ώστε όλα τα View στην τρέχουσα Activity να ανανεωθούν σωστά με το νέο θέμα.

  4. Ορισμός θεμάτων στο styles.xml: Ορίστε στυλ για το φωτεινό και σκοτεινό θέμα στα res/values/styles.xml και res/values-night/styles.xml, αντίστοιχα, κληρονομώντας από τα Theme.AppCompat.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Ορισμοί στυλ για το φωτεινό θέμα -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Ορισμοί στυλ για το σκοτεινό θέμα -->
    </style>
    

    Στο AndroidManifest.xml, καθορίστε το βασικό θέμα της εφαρμογής:

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Activities -->
    </application>
    
  5. Παρακολούθηση αλλαγών θέματος: Σε περίπτωση που το θέμα αλλάζει από το σύστημα (π.χ., κατά προγραμματισμό ή χειροκίνητα από τον χρήστη μέσω ρυθμίσεων τηλεφώνου), μπορείτε να χρησιμοποιήσετε το Configuration.uiMode στο onConfigurationChanged() για να αντιδράσετε, αλλά το AppCompatDelegate συνήθως το διαχειρίζεται αυτόματα όταν χρησιμοποιείται το MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Μπορείτε να ελέγξετε το νέο θέμα, αν χρειάζεται
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

Η χρήση του AppCompatDelegate είναι η προτεινόμενη προσέγγιση για την υποστήριξη θεμάτων στο Android, καθώς διασφαλίζει backward compatibility και σωστή λειτουργία με διάφορα στοιχεία της βιβλιοθήκης υποστήριξης.