Sobes.tech
Junior

Cum să salvezi și să utilizezi setările temei într-o aplicație Android?

sobes.tech AI

Răspuns de la AI

Abordarea eficientă include utilizarea SharedPreferences pentru salvarea temei selectate și AppCompatDelegate.setDefaultNightMode() pentru aplicarea acesteia.

  1. Salvarea temei: Utilizați SharedPreferences pentru a stoca identificatorul temei selectate (de exemplu, "light", "dark", "system").

    // Obțineți SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Obțineți editorul
    val editor = sharedPrefs.edit()
    // Aplicați tema cu ID-ul themeId
    editor.putString("current_theme", themeId)
    // Salvați modificările
    editor.apply()
    
  2. Aplicarea temei la pornire: În clasa principală Activity sau Application, citiți valoarea salvată din SharedPreferences și aplicați tema.

    // Citiți valoarea salvată a temei
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Implicit 'system'
    
    // Aplicați tema
    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. Schimbarea temei de către utilizator: Oferiți o interfață utilizator (de exemplu, RadioButton în setări), unde utilizatorul poate alege tema. La alegere, salvați noul identificator în SharedPreferences și aplicați tema imediat, apelând AppCompatDelegate.setDefaultNightMode() și, dacă este necesar, repornind Activity pentru aplicarea corectă a temei.

    // Presupunem că utilizatorul a ales tema întunecată
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Aplicați tema imediat
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Sau recreate() pentru aplicarea completă a temei
    // recreate()
    

    Reporniți Activity cu recreate() pentru ca toate View-urile din Activity curent să fie reafișate corect cu noua temă.

  4. Definirea temelor în styles.xml: Definiți stilurile pentru tema luminoasă și întunecată în res/values/styles.xml și res/values-night/styles.xml, respectiv, moștenind de la Theme.AppCompat.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Definiții de stil pentru tema luminoasă -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Definiții de stil pentru tema întunecată -->
    </style>
    

    În AndroidManifest.xml, specificați tema de bază a aplicației:

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Activități -->
    </application>
    
  5. Ascultarea schimbărilor de temă: În cazul în care tema se schimbă sistematic (de exemplu, după program sau manual de utilizator prin setările telefonului), puteți folosi Configuration.uiMode în onConfigurationChanged() pentru a reacționa, dar AppCompatDelegate gestionează de obicei acest lucru automat când se folosește MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Puteți verifica noua temă, dacă este necesar
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

Utilizarea AppCompatDelegate este abordarea recomandată pentru suportul temelor pe Android, deoarece asigură compatibilitatea înapoi și funcționarea corectă cu diferite componente ale bibliotecii de suport.