PreferenceManager getDefaultSharedPreferences устарело в Android 10. Как мне его заменить?
Цитата из PreferenceManagerдокументация:
This class was deprecated in API level 29.
Use the AndroidX Preference Library for consistent behavior across all devices. For more information on using the AndroidX Preference Library see Settings.
Да, это устарело. Используйте библиотеку настроек AndroidX для согласованного поведения на всех устройствах. Дополнительные сведения об использовании библиотеки настроек AndroidX см. в разделе «Настройки».
Следовать этому -
Вы можете использовать версию библиотеки поддержки Android 10 PreferenceManager, т. е. androidx.preference.PreferenceManager, а не android.preference.PreferenceManager.
Не забудьте добавить в build.gradle следующее:
implementation 'androidx.preference:preference:1.1.1'
@AbhinavSaxena Да, конечно. Это неявно при использовании библиотеки поддержки. Более раннее редактирование этого ответа добавило зависимость ktx только для kotlin; Я откатил это редактирование, потому что оно было только для kotlin.
Кажется, это должно быть implementation, а не dependency?
Это тоже не работает: невозможно разрешить зависимость для ':app@debugAndroidTest/compileClasspath': не удалось найти реализацию "androidx.preference:preference:1.1.0.
Мне любопытно; почему они устарели от этого интерфейса, и был ли предпочтительнее какой-то другой способ получения общих настроек, или целью было переключение на androidx?
@EdwardFalk Я не знаю, но для меня это пахнет getDefaultSharedPreferences() побочным ущербом. Да, многие области, связанные с предпочтениями, были фрагментированы, поэтому имеет смысл перенести их в библиотеку поддержки. getDefaultSharedPreferences() сама реализация одинакова как на платформе Android, так и в библиотеках AndroidX, поэтому эта функция не требует устаревания.
Где в build.gradle я добавляю эту строку? Что произойдет со старыми мобильными телефонами, если я поменяю «андроид». на "androidx."?
Пакет preference предоставляет androidxPreferenceManager:
Ява: implementation "androidx.preference:preference:1.1.1"
Котлин: implementation "androidx.preference:preference-ktx:1.1.1"
то есть
изменить android.preference.PreferenceManager на androidx.preference.PreferenceManager
Также см. PreferenceFragmentCompat, который является текущим классом PreferenceFragment для использования.
Добавлена прямая ссылка на PreferenceFragmentCompat, которой тогда не было... обычно это следующая проблема устаревания, с которой можно столкнуться при попытке обновить настройки. Другой связанный ответ действителен только в течение ограниченного периода времени.
Можем ли мы использовать в API до API 29?
@ Х.Карацанов да, можно.
Если вы просто сохраняете и извлекаете пары ключ-значение, вы можете заменить:
prefs = PreferenceManager.getDefaultSharedPreferences(this);
с участием:
prefs = getSharedPreferences(
"my.app.packagename_preferences", Context.MODE_PRIVATE);
Обязательно используйте правильное имя файла для новой реализации, иначе ваши пользователи потеряют доступ ко всему, что было сохранено с помощью getDefaultSharedPreferences(!). Следующее получит имя файла, которое использует getDefaultSharedPreferences:
getPackageName() + "_preferences"
Это хороший ответ, так как context.getPackageName() также работает в модулях и извлекает идентификатор приложения.
Также обратите внимание; для java, а не для котлина. Kotlin это будет выглядеть как getSharedPreferences(applicationContext.packageName, Context.MODE_PRIVATE)
Хороший способ избежать ненужного использования androidx.preference.PreferenceManager только для доступа к getDefaultSharedPreferences.
implementation 'androidx.preference:preference-ktx:1.1.1'
Configuration.getInstance().load(this, androidx.preference.PreferenceManager.getDefaultSharedPreferences(this))
Вы можете импортировать эту библиотеку на уровне приложения.
implementation "androidx.preference:preference-ktx:1.1.1"
Затем удалите импортированный файл из класса, в котором вы создаете «PreferenceManager». Нажмите Alt + Enter и импортируйте androidx, надеюсь, вы получите последнюю версию диспетчера настроек.
implementation "androidx.preference:preference-ktx:1.1.1"
файл класса PrivateSharedPreferences;
class PrivateSharedPreferences(context: Context) {
private val file = "com.example.com_shared"
private val key = "private_key"
private var sharedPreferences = context.getSharedPreferences(file, Context.MODE_PRIVATE)
private val editor = sharedPreferences.edit()
fun save(ok: Boolean) {
editor.putBoolean(key, ok)
editor.apply()
}
fun read() : Boolean {
return sharedPreferences.getBoolean(key, false)
}
}
читать из фрагмента или адаптера;
PrivateSharedPreferences(context).read()
спасти
PrivateSharedPreferences(context).save(true)
Используйте Хранилище данных Jetpack. Это решение для хранения данных, которое позволяет хранить пары ключ-значение или типизированные объекты с буферами протокола. DataStore использует сопрограммы Kotlin и Flow для асинхронного и согласованного хранения данных. и транзакционно.
If you're currently using SharedPreferences to store data, consider migrating to DataStore instead.
Настраивать
dependencies {
implementation "androidx.datastore:datastore:1.0.0"
}
Он также поддерживает RxJava2 и RxJava3.
Иногда у нас есть один выбор, и это только общие настройки, например, когда вы используете сторонние библиотеки, которые получают общие настройки в качестве параметра, вызываемого в каком-либо методе. открытый метод загрузки конфигурации карты улиц случай.
Что не соответствовало оригиналу?