Рубрики
Без рубрики

Реализуйте темный/ночной режим в приложении для Android с переключателем ListPreference

Фотография на обложке Максимиляхова на Unsplash Здравствуйте, друзья! Чтобы представиться, я Ният Лотликар… С тегами android, kotlin, учебник, java.

Фото на обложке МаксиМиляхов на Расплескать

Здравствуйте, друзья!

Чтобы представиться, я Ният Лотликар, разработчик Android. В настоящее время я работаю над своим портфолио и хотел бы поделиться тем, чему я недавно научился, работая над ним. Это мой первый пост, так что не стесняйтесь вносить любые исправления и предложения.

Без дальнейших проволочек, давайте отправляться в путь!

Первый шаг для включения темного режима – изменить тему приложения на Theme. Совместимость с приложением. День Ночь или Тема. Материальные Компоненты. Днем и ночью если вы используете библиотеку дизайна материалов.

res/values/styles.xml


Затем создайте предпочтительное действие. Это можно легко сделать с помощью шаблонов Android Studio или вы даже можете сделать это вручную.

Это можно легко сделать с помощью шаблонов Android Studio или вы даже можете сделать это вручную.

class SettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.settings_activity)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings, SettingsFragment())
            .commit()
    }

    class SettingsFragment : PreferenceFragmentCompat() {
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey)
        }
    }
}

Нам нужен Список предпочтений в нашем root_prefernces.xml файл и поэтому это должно выглядеть примерно так:

res/values/xml/root_preferences.xml


    

        

    



Здесь приложение: значение по умолчанию используется для установки значения по умолчанию, которое хранится в strings.xml . Приложение: название и значения атрибута app:ключ определяют отображаемый заголовок предпочтения и ключ для его идентификации соответственно.

res/values/strings.xml


    
    UI
    Dark Mode
    MODE_NIGHT_FOLLOW_SYSTEM

атрибуты app:записи и app:значения записи принимают значения массива, которые определяют соответствующее отображаемое имя и значение, которое оно несет, поэтому убедитесь, что они расположены в правильном порядке. Я добавил свои массивы в arrays.xml как показано ниже:

res/values/arrays.xml


    
    
        Follow System Dark Mode
        Light Mode Selected
        Dark Mode Selected
        Auto Battery Dark Mode
    

    
        MODE_NIGHT_FOLLOW_SYSTEM
        MODE_NIGHT_NO
        MODE_NIGHT_YES
        MODE_NIGHT_AUTO_BATTERY
    


Теперь, когда мы закончили с макетом, давайте посмотрим на код.

Функция AppCompatDelegate класс' установить ночной режим по умолчанию() используется для изменения настроек ночного режима. Этому методу могут быть переданы следующие значения: AppCompatDelegate. РЕЖИМ_НАЙТА_ПОДПИСАНИЯ_СИСТЕМЫ - Это переключит ночной режим в зависимости от того, включен ли общесистемный темный режим или нет. appcompatделегировать. MODE_NIGHT_NO - Будет включен режим освещения. appcompatделегировать. MODE_NIGHT_YES - будет включен темный/ночной режим. appcompatделегировать. MODE_NIGHT_AUTO_BATTERY - Темный/ночной режим будет включен, когда устройство находится в режиме экономии заряда батареи.

Итак, где мы можем использовать этот метод? Реализовать Общие предпочтения. OnSharedPreferenceChangeListener в Настройки Активности и переопределите функцию onSharedPreferenceChanged() .

и переопределите функцию || onSharedPreferenceChanged()||.

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
        val darkModeString = getString(R.string.dark_mode)
        key?.let {
            if (it == darkModeString) sharedPreferences?.let { pref ->
                val darkModeValues = resources.getStringArray(R.array.dark_mode_values)
                when (pref.getString(darkModeString, darkModeValues[0])) {
                    darkModeValues[0] -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
                    darkModeValues[1] -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
                    darkModeValues[2] -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
                    darkModeValues[3] -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY)
                }
            }
        }
    }

Как вы можете видеть, я извлекаю предпочтение в приведенном выше коде и использую его, чтобы определить, какой параметр выбран в предпочтении списка. С помощью этого изменяются настройки ночного режима.

Теперь, очень важная вещь, которую нужно сделать, это зарегистрировать и отменить регистрацию OnSharedPreferenceChangeListener . Это гарантирует, что изменения будут внесены практически мгновенно при вводе пользователем, а также предотвратит утечку памяти. Зарегистрируйте прослушиватель в функции onCreate() и отмените регистрацию в функции onDestroy() .

Зарегистрируйте прослушиватель в функции || onCreate()|| и отмените регистрацию в функции || onDestroy()||.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.settings_activity)
    supportFragmentManager
        .beginTransaction()
        .replace(R.id.settings, SettingsFragment())
        .commit()
    supportActionBar?.setDisplayHomeAsUpEnabled(true)

    PreferenceManager.getDefaultSharedPreferences(this)
        .registerOnSharedPreferenceChangeListener(this)
}

override fun onDestroy() {
    super.onDestroy()
    PreferenceManager.getDefaultSharedPreferences(this)
        .unregisterOnSharedPreferenceChangeListener(this)
}

Теперь необходимо предусмотреть возможность перехода к действию Настройки , что я и сделал, добавив действие в меню параметров. Вы можете использовать то, что лучше всего подходит для вас.

Можно добавлять отдельные иконки, цвета, стили и другие ресурсы для использования в дневном и ночном режимах. Вы делаете это, добавляя эти ресурсы в папки ресурсов с расширением - ночь . Например, извлекаемый-ночь или значения-ночь .

И благодаря этому мы успешно включили наш переключатель темного режима.

Однако есть одна проблема. Как вы можете видеть, ListPreference не показывает, какой параметр в данный момент выбран в сводке. Как нам это исправить? Ну, на самом деле это очень просто. Здесь нужно сделать всего две вещи: Во-первых, установите значение атрибута app:use Simple Summary Provider равным true в ListPreference .

res/xml/root_preferences.xml


Во-вторых, реализуйте предпочтение . Поставщик сводки интерфейс в Активность настроек и переопределите его функцию предоставить сводку() .

и переопределите его функцию || предоставить сводку()||.

override fun provideSummary(preference: ListPreference?): CharSequence =
        if (preference?.key == getString(R.string.dark_mode)) preference.entry
        else "Unknown Preference"

Обратите внимание, что я использую android.preference. Предпочтение . Поставщик сводки недоступен в android.preference. Предпочтение т.е. пакет Android.

И на этом этот урок завершен. Ознакомьтесь с полным кодом на моем GitHub здесь:

Aurum 1611/Руководство по настройкам темного режима

Учебное приложение в качестве руководства по реализации ночного/темного режима с использованием ListPreference в Android.

По запросу я создал аналог Java для проекта:

Aurum1611/Учебник по настройке темного режима Java

Часть урока, в котором показано, как создать темный режим в Android. Этот проект написан на Java и является аналогом учебника по настройке темного режима, версии Kotlin.

Оригинал: "https://dev.to/aurumtechie/implement-dark-night-mode-in-an-android-app-with-a-listpreference-toggle-2k5i"