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