Sobes.tech
Junior

Kā saglabāt un izmantot motīva iestatījumus Android lietotnē?

sobes.tech AI

Atbilde no AI

Efektīva pieeja ietver SharedPreferences izmantošanu izvēlētās tēmas saglabāšanai un AppCompatDelegate.setDefaultNightMode() piemērošanai:

  1. Tēmas saglabāšana: Izmantojiet SharedPreferences, lai saglabātu izvēlētās tēmas identifikatoru (piemēram, "light", "dark", "system").

    // Iegūstam SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Iegūstam redaktoru
    val editor = sharedPrefs.edit()
    // Pielietojam tēmu ar ID themeId
    editor.putString("current_theme", themeId)
    // Saglabājam izmaiņas
    editor.apply()
    
  2. Tēmas piemērošana palaišanas laikā: Galvenajā Activity vai Application klasē nolasiet saglabāto vērtību no SharedPreferences un piemērojiet tēmu:

    // Nolasām saglabāto tēmas vērtību
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Noklusējums 'system'
    
    // Pielietojam tēmu
    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. Lietotāja veiktās tēmas maiņa: Nodrošiniet lietotāja saskarni (piemēram, RadioButton iestatījumos), kur lietotājs var izvēlēties tēmu. Izvēloties, saglabājiet jauno identifikatoru SharedPreferences un nekavējoties piemērojiet tēmu, izsaucot AppCompatDelegate.setDefaultNightMode() un, ja nepieciešams, pārstartiet Activity, lai pareizi piemērotu tēmu:

    // Pieņemsim, lietotājs izvēlējās tumšo tēmu
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Piemēro tēmu nekavējoties
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // Vai `recreate()` pilnīgai piemērošanai
    // recreate()
    

    Activity pārstartēšana ar recreate() var būt nepieciešama, lai visi skati pašreizējā Activity būtu pareizi pārkrāsoti ar jauno tēmu.

  4. Tēmu definēšana styles.xml: Definējiet gaišas un tumšas tēmas stilus res/values/styles.xml un res/values-night/styles.xml atbilstoši, mantojot no Theme.AppCompat:

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Gaismas tēmas stilu definīcijas -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Tumšas tēmas stilu definīcijas -->
    </style>
    

    AndroidManifest.xml norādiet galveno lietojumprogrammas tēmu:

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Activities -->
    </application>
    
  5. Tēmas izmaiņu uzraudzība: Ja sistēma maina tēmu (piemēram, pēc grafika vai lietotāja manuāli), var izmantot Configuration.uiMode onConfigurationChanged() reakcijai, bet AppCompatDelegate parasti to automātiski apstrādā, izmantojot MODE_NIGHT_FOLLOW_SYSTEM.

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Var pārbaudīt jauno tēmu, ja nepieciešams
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

AppCompatDelegate izmantošana ir ieteicamā pieeja tēmām Android, jo tā nodrošina atbalstu atpakaļ saderībai un pareizu darbību ar dažādām bibliotēkas komponentēm.