Sobes.tech
Junior

Ako uložiť a použiť nastavenia motívu v aplikácii na Android?

sobes.tech AI

Odpoveď od AI

Efektívny prístup zahŕňa použitie SharedPreferences na uloženie vybranej témy a AppCompatDelegate.setDefaultNightMode() na jej aplikáciu.

  1. Uloženie témy: Použite SharedPreferences na uloženie identifikátora vybranej témy (napríklad, "light", "dark", "system").

    // Získanie SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Získanie editora
    val editor = sharedPrefs.edit()
    // Aplikovanie témy s ID themeId
    editor.putString("current_theme", themeId)
    // Uloženie zmien
    editor.apply()
    
  2. Aplikovanie témy pri štarte: V hlavnej Activity alebo Application triede načítajte uloženú hodnotu a aplikujte tému.

    // Čítanie uloženého hodnoty témy
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Predvolene 'system'
    
    // Aplikovanie témy
    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. Zmena témy používateľom: Poskytnite používateľské rozhranie (napríklad, RadioButton v nastaveniach), kde si používateľ môže vybrať tému. Pri výbere uložte nový identifikátor do SharedPreferences a okamžite aplikujte tému volaním AppCompatDelegate.setDefaultNightMode() a v prípade potreby reštartujte Activity na správne použitie témy.

    // Predpokladáme, že používateľ zvolil tmavú tému
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Aplikujte tému okamžite
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Alebo recreate() pre úplné použitie témy
    // recreate()
    

    Reštart Activity pomocou recreate() môže byť potrebný, aby sa všetky View v aktuálnej Activity správne prekreslili s novou témou.

  4. Definovanie tém v styles.xml: Definujte štýly pre svetlú a tmavú tému v res/values/styles.xml a res/values-night/styles.xml s odvodom od Theme.AppCompat.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Definície štýlov pre svetlú tému -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Definície štýlov pre tmavú tému -->
    </style>
    

    V AndroidManifest.xml uveďte základnú tému aplikácie:

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Activities -->
    </application>
    
  5. Sledovanie zmien témy: V prípade, že sa téma mení systémovo (napríklad podľa rozvrhu alebo manuálne používateľom cez nastavenia telefónu), môžete použiť Configuration.uiMode v onConfigurationChanged() na reakciu, ale AppCompatDelegate to zvyčajne spravuje automaticky pri použití MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Môžete skontrolovať novú tému, ak je potrebné
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

Použitie AppCompatDelegate je odporúčaný prístup na podporu tém na Android, pretože zabezpečuje spätnú kompatibilitu a správnu funkčnosť s rôznymi komponentmi knižnice podpory.