Sobes.tech
Junior

Чӣ гуна нигоҳ доштани ва истифодаи танзимоти мавзӯъ дар барномаи Android?

sobes.tech AI

Ҷавоб аз AI

Равишти самаранок даромад мекунад, ки истифодаи SharedPreferences барои нигоҳ доштани мавзӯи интихобшуда ва AppCompatDelegate.setDefaultNightMode() барои татбиқ кардани он дохил аст.

  1. Нигоҳдории мавзӯъ: Истифодаи SharedPreferences барои нигоҳ доштани шенасоии мавзӯи интихобшуда (масалан, "light", "dark", "system").

    // Гирифтани SharedPreferences
    val sharedPrefs = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
    // Гирифтани муҳаррир
    val editor = sharedPrefs.edit()
    // Татбиқи мавзӯъ бо ID-и themeId
    editor.putString("current_theme", themeId)
    // Ҳифз кардани тағирот
    editor.apply()
    
  2. Татбиқи мавзӯъ дар оғоз: Дар Activity ё Application асосӣ, арзиши нигоҳдоштаро хонда ва мавзӯъро татбиқ кунед.

    // Хондани арзиши нигоҳдоштаро
    val themeId = getSharedPreferences("AppTheme", Context.MODE_PRIVATE)
        .getString("current_theme", "system") // '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 дар танзимотҳо) пешниҳод кунед, ки дар он корбар метавонад мавзӯъро интихоб кунад. Ҳангоми интихоби он, ID-ро дар 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() метавонад зарур бошад, то ҳама View-ҳо дар Activity ҳозира дуруст бо мавзӯи нав тасвир шаванд.

  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.uiMode-ро дар onConfigurationChanged() истифода баред, аммо 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 аст, зеро он мутобиқатро таъмин мекунад ва бо компонентҳои гуногуни китобхонаи дастгирӣ дуруст кор мекунад.