PreferenceManager getDefaultSharedPreferences устарел в Android Q

PreferenceManager getDefaultSharedPreferences устарело в Android 10. Как мне его заменить?

184
0
57 030
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Цитата из 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.

Что не соответствовало оригиналу?

android developer 10.12.2019 10:01

Да, это устарело. Используйте библиотеку настроек AndroidX для согласованного поведения на всех устройствах. Дополнительные сведения об использовании библиотеки настроек AndroidX см. в разделе «Настройки».

Следовать этому -

PreferenceManager

Ответ принят как подходящий

Вы можете использовать версию библиотеки поддержки Android 10 PreferenceManager, т. е. androidx.preference.PreferenceManager, а не android.preference.PreferenceManager.

Не забудьте добавить в build.gradle следующее:

implementation 'androidx.preference:preference:1.1.1'

@AbhinavSaxena Да, конечно. Это неявно при использовании библиотеки поддержки. Более раннее редактирование этого ответа добавило зависимость ktx только для kotlin; Я откатил это редактирование, потому что оно было только для kotlin.

laalto 04.02.2020 18:03

Кажется, это должно быть implementation, а не dependency?

Richard Barraclough 27.06.2020 16:42

Это тоже не работает: невозможно разрешить зависимость для ':app@debugAndroidTest/compileClasspath': не удалось найти реализацию "androidx.preference:preference:1.1.0.

Richard Barraclough 27.06.2020 16:43

Мне любопытно; почему они устарели от этого интерфейса, и был ли предпочтительнее какой-то другой способ получения общих настроек, или целью было переключение на androidx?

Edward Falk 03.08.2020 19:56

@EdwardFalk Я не знаю, но для меня это пахнет getDefaultSharedPreferences() побочным ущербом. Да, многие области, связанные с предпочтениями, были фрагментированы, поэтому имеет смысл перенести их в библиотеку поддержки. getDefaultSharedPreferences() сама реализация одинакова как на платформе Android, так и в библиотеках AndroidX, поэтому эта функция не требует устаревания.

laalto 03.08.2020 21:57

Где в build.gradle я добавляю эту строку? Что произойдет со старыми мобильными телефонами, если я поменяю «андроид». на "androidx."?

Chameleon 26.08.2020 20:09

Пакет 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, которой тогда не было... обычно это следующая проблема устаревания, с которой можно столкнуться при попытке обновить настройки. Другой связанный ответ действителен только в течение ограниченного периода времени.

Martin Zeitler 13.04.2020 00:30

Можем ли мы использовать в API до API 29?

H.Karatsanov 25.06.2020 20:20

@ Х.Карацанов да, можно.

Luis 24.06.2021 19:55

Если вы просто сохраняете и извлекаете пары ключ-значение, вы можете заменить:

 prefs = PreferenceManager.getDefaultSharedPreferences(this); 

с участием:

 prefs = getSharedPreferences(
            "my.app.packagename_preferences", Context.MODE_PRIVATE);

Обязательно используйте правильное имя файла для новой реализации, иначе ваши пользователи потеряют доступ ко всему, что было сохранено с помощью getDefaultSharedPreferences(!). Следующее получит имя файла, которое использует getDefaultSharedPreferences:

getPackageName() + "_preferences"

Это хороший ответ, так как context.getPackageName() также работает в модулях и извлекает идентификатор приложения.

Robert 19.04.2021 20:08

Также обратите внимание; для java, а не для котлина. Kotlin это будет выглядеть как getSharedPreferences(applicationContext.packageName, Context.MODE_PRIVATE)

James Smith 30.04.2021 20:36

Хороший способ избежать ненужного использования androidx.preference.PreferenceManager только для доступа к getDefaultSharedPreferences.

A.J. 22.08.2021 19:16

Библиотека Котлина

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.

Иногда у нас есть один выбор, и это только общие настройки, например, когда вы используете сторонние библиотеки, которые получают общие настройки в качестве параметра, вызываемого в каком-либо методе. открытый метод загрузки конфигурации карты улиц случай.

Reyhane Farshbaf 25.11.2021 08:53

Другие вопросы по теме