Фото на обложке МаксиМиляхов на Расплескать
Здравствуйте, друзья!
Чтобы представиться, я Ният Лотликар, разработчик 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"