Sobes.tech
Junior

Jak uložit a používat nastavení motivu v aplikaci na Androidu?

sobes.tech AI

Odpověď od AI

Efektivní přístup zahrnuje použití SharedPreferences pro uložení vybraného motivu a AppCompatDelegate.setDefaultNightMode() pro jeho použití.

  1. Uložení motivu: Použijte SharedPreferences k uložení identifikátoru vybraného motivu (například "light", "dark", "system").

    // Získání SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Získání editoru
    val editor = sharedPrefs.edit()
    // Použití motivu s ID themeId
    editor.putString("current_theme", themeId)
    // Uložení změn
    editor.apply()
    
  2. Použití motivu při spuštění: V hlavní třídě Activity nebo Application načtěte uloženou hodnotu a aplikujte motiv.

    // Čtení uložené hodnoty motivu
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Výchozí 'system'
    
    // Aplikace motivu
    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. Změna motivu uživatelem: Poskytněte uživatelské rozhraní (například RadioButton v nastavení), kde si uživatel může vybrat motiv. Při výběru uložte nový identifikátor do SharedPreferences a ihned aplikujte motiv voláním AppCompatDelegate.setDefaultNightMode() a případně restartujte Activity pro správné použití motivu.

    // Předpokládejme, že uživatel zvolil tmavý motiv
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Aplikace motivu ihned
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Nebo recreate() pro úplné použití motivu
    // recreate()
    

    Restart Activity pomocí recreate() může být nutný, aby se všechny View v aktuální Activity správně překreslily s novým motivem.

  4. Definice motivů v styles.xml: Definujte styly pro světlý a tmavý motiv v res/values/styles.xml a res/values-night/styles.xml odpovídajícím způsobem, děděním od Theme.AppCompat.

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Definice stylů pro světlý motiv -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Definice stylů pro tmavý motiv -->
    </style>
    

    V AndroidManifest.xml uveďte základní motiv aplikace:

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Aktivity -->
    </application>
    
  5. Sledování změn motivu: Pokud se motiv změní systémově (například podle rozvrhu nebo ručně uživatelem přes nastavení telefonu), můžete použít Configuration.uiMode v onConfigurationChanged() pro reakci, ale AppCompatDelegate to obvykle spravuje automaticky při použití MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Můžete zkontrolovat nový motiv, pokud je třeba
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

Použití AppCompatDelegate je doporučený přístup pro podporu motivů na Androidu, protože zajišťuje zpětnou kompatibilitu a správnou funkčnost s různými komponenty podpůrné knihovny.