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 менен колдонуу
    editor.putString("current_theme", themeId)
    // Өзгөртүүлөрдү сактоо
    editor.apply()
    
  2. Теманы колдонуу ишке киргизүүдө: Негизги Activity же Application класста сакталган маанини SharedPreferences аркылуу окуп, теманы колдонуу:

    // Сакталган теманын маанисин окуу
    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 орнотуу) түзүңүз, анда колдонуучу теманы тандай алат. Тандоодон кийин жаңы идентификаторду 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.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 үчүн темаларды колдоо үчүн сунушталат, анткени ал керектүү керектөөчүлүк жана ар кандай китепкана компоненттери менен туура иштейт.