Sobes.tech
Junior

Kaip išsaugoti ir naudoti temos nustatymus Android programėlėje?

sobes.tech AI

Atsakymas iš AI

Veiksmingas požiūris apima SharedPreferences naudojimą pasirinktos temos išsaugojimui ir AppCompatDelegate.setDefaultNightMode() taikymą:

  1. Temos išsaugojimas: Naudokite SharedPreferences saugoti pasirinktos temos identifikatorių (pavyzdžiui, "light", "dark", "system").

    // Gaukite SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Gaukite redaktorių
    val editor = sharedPrefs.edit()
    // Taikykite temą su ID themeId
    editor.putString("current_theme", themeId)
    // Išsaugokite pakeitimus
    editor.apply()
    
  2. Temos taikymas paleidžiant: Pagrindiniame Activity arba Application klasėje perskaitykite išsaugotą reikšmę iš SharedPreferences ir taikykite temą:

    // Perskaitykite išsaugotą temos reikšmę
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Numatyta "system"
    
    // Taikykite temą
    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. Vartotojo keičiamą temą: Sukurkite vartotojo sąsają (pavyzdžiui, RadioButton nustatymuose), kur vartotojas gali pasirinkti temą. Pasirinkus, išsaugokite naują identifikatorių SharedPreferences ir nedelsiant taikykite temą, iškviesdami AppCompatDelegate.setDefaultNightMode() ir, jei reikia, perkraukite Activity tinkamam taikymui:

    // Tarkime, vartotojas pasirinko tamsią temą
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Taikykite temą nedelsiant
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Arba `recreate()` pilnam taikymui
    // recreate()
    

    Activity perkrovimas naudojant recreate() gali būti būtinas, kad visi vaizdai dabartiniame Activity būtų teisingai perpiešti su nauja tema.

  4. Temų apibrėžimas styles.xml: Apibrėžkite šviesos ir tamsos temas res/values/styles.xml ir res/values-night/styles.xml atitinkamai, paveldėdami iš Theme.AppCompat:

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Šviesos temos stiliaus apibrėžimai -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Tamsios temos stiliaus apibrėžimai -->
    </style>
    

    AndroidManifest.xml nurodykite pagrindinę programos temą:

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Activities -->
    </application>
    
  5. Stebėjimas dėl temų pakeitimų: Jei sistema keičia temą (pavyzdžiui, pagal grafiką arba rankiniu būdu vartotojo nustatymais), galite naudoti Configuration.uiMode onConfigurationChanged() reakcijai, tačiau AppCompatDelegate dažniausiai tai automatiškai tvarko naudojant MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Galite patikrinti naują temą, jei reikia
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

Naudojimas AppCompatDelegate yra rekomenduojamas požiūris temų palaikymui Android, nes jis užtikrina atgalinį suderinamumą ir tinkamą darbą su įvairiais bibliotekos komponentais.