Sobes.tech
Junior

Ինչպես պահպանել և օգտագործել թեմայի կարգավորումները Android հավելվածում?

sobes.tech AI

Պատասխան AI-ից

Արդյունավետ մոտեցումը ներառում է SharedPreferences օգտագործումը ընտրված թեմայի պահպանման համար և AppCompatDelegate.setDefaultNightMode() դրա կիրառման համար:

  1. Թեմայի պահպանումը: Օգտագործեք SharedPreferences՝ ընտրված թեմայի նույնականացման համար (օրինակ՝ "լույս", "գիշեր", "համակարգ").

    // Ստանում ենք SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Ստանում ենք խմբագրիչ
    val editor = sharedPrefs.edit()
    // Կիրառում ենք թեման ID themeId
    editor.putString("current_theme", themeId)
    // Պահպանում ենք փոփոխությունները
    editor.apply()
    
  2. Թեմայի կիրառումը գործարկման ժամանակ: Հիմնական Activity կամ Application դասում կարդացեք պահպանված արժեքը SharedPreferences-ից և կիրառեք թեման:

    // Կարդում ենք պահպանված թեմայի արժեքը
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // Դեպի համակարգը ըստ նախընտրության
    
    // Կիրառում ենք թեման
    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. Օգտատիրոջ կողմից թեմայի փոփոխությունը: Պատրաստեք օգտագործողի ինտերֆեյս (օրինակ՝ RadioButton կարգավորումների մեջ), որտեղ օգտատերը կարող է ընտրել թեման: Ընտրության ժամանակ պահպանեք նոր նույնականացումը SharedPreferences-ում և անմիջապես կիրառեք թեման՝ զանգահարելով AppCompatDelegate.setDefaultNightMode() և անհրաժեշտության դեպքում վերագործարկելով Activity՝ ճիշտ կիրառելու համար:

    // Օրինակ՝ օգտատերը ընտրել է գիշերային թեմա
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    val editor = sharedPrefs.edit()
    editor.putString("current_theme", "dark")
    editor.apply()
    
    // Կիրառում ենք թեման անմիջապես
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    
    // կամ `recreate()`՝ ամբողջական կիրառման համար
    // recreate()
    

    Activity-ի վերագործարկումը recreate()-ով կարող է անհրաժեշտ լինել, որպեսզի բոլոր տեսքերը ճիշտ վերանվագրվեն նոր թեմայով:

  4. Թեմաների սահմանում styles.xml-ում: Սահմանեք լույս և գիշեր թեմաների ոճերը res/values/styles.xml և res/values-night/styles.xml-ում համապատասխանաբար, ժառանգելով Theme.AppCompat-ից:

    <!-- res/values/styles.xml -->
    <style name="AppTheme.Light" parent="Theme.AppCompat.Light">
        <!-- Լույս թեմայի ոճերի սահմանումներ -->
    </style>
    
    <!-- res/values-night/styles.xml -->
    <style name="AppTheme.Dark" parent="Theme.AppCompat">
        <!-- Գիշերային թեմայի ոճերի սահմանումներ -->
    </style>
    

    AndroidManifest.xml-ում նշեք բազային թեման՝

    <!-- AndroidManifest.xml -->
    <application
        android:theme="@style/AppTheme.Light"
        ...>
        <!-- ... Activities -->
    </application>
    
  5. Թեմայի փոփոխությունների հսկում: Եթե համակարգը փոխում է թեման (օրինակ՝ ըստ ժամանակացույցի կամ ձեռքով օգտագործողի կողմից), կարող եք օգտագործել Configuration.uiModeonConfigurationChanged()-ում՝ արձագանքելու համար, բայց AppCompatDelegate-ը սովորաբար ինքնուրույն է դա անում MODE_NIGHT_FOLLOW_SYSTEM-ի դեպքում:

    @Override
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // Կարող եք ստուգել նոր թեման, եթե անհրաժեշտ է
        // val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
        // ...
    }
    

AppCompatDelegate-ի օգտագործումը առաջարկվող մոտեցումն է թեմաների աջակցելու համար Android-ում, քանի որ այն ապահովում է հետամնաց համատեղելիություն և ճիշտ աշխատում է տարբեր աջակցման գրադարանի բաղադրիչների հետ։