在Android Q中,PreferenceManager.getDefaultSharedPreferences被弃用。

222

PreferenceManager getDefaultSharedPreferencesAndroid 10 已经被弃用。我该如何替换它?

10个回答

382

您可以使用Android 10支持库版本的PreferenceManager,即androidx.preference.PreferenceManager而不是android.preference.PreferenceManager

请记得将以下内容添加到您的build.gradle文件中:

implementation 'androidx.preference:preference:1.2.0'

1
@AbhinavSaxena 当然可以。使用支持库时,这是隐含的。此答案的早期编辑添加了仅限Kotlin的ktx依赖项;我回滚了该编辑,因为它仅适用于Kotlin。 - laalto
我很好奇,为什么他们放弃了那个接口?是否有其他方式来获取共享首选项,还是切换到AndroidX是意图? - Edward Falk
1
@EdwardFalk 我不知道,但对我来说,它闻起来像是getDefaultSharedPreferences()成为了附带损伤。是的,许多与首选项相关的区域被分散了,因此将它们移动到支持库中是有意义的。getDefaultSharedPreferences()实现本身在Android平台和AndroidX库中仍然是相同的,因此该函数并不真正需要弃用。 - laalto
在 build.gradle 中我应该添加这一行代码? 如果我将 "android." 改为 "androidx.",旧的手机会发生什么? - Chameleon
Xamarin.Android怎么样?我尝试过AndroidX.Preferences,但它不存在。 - Pavlos Mavris
显示剩余2条评论

201

preference提供了androidxPreferenceManager

Java代码:implementation "androidx.preference:preference:1.1.1"

Kotlin代码:implementation "androidx.preference:preference-ktx:1.1.1"


例如,将android.preference.PreferenceManager更改为androidx.preference.PreferenceManager


此外,请参阅PreferenceFragmentCompat,这是当前应使用的PreferenceFragment类。


添加了一个直接链接到PreferenceFragmentCompat,当尝试更新首选项时,这通常是下一个过时问题。另一个链接的答案只在有限的时间内有效。 - Martin Zeitler
我们可以在 API 29 之前使用吗? - H.Karatsanov
@H.Karatsanov 是的,你可以。 - Luis

23

如果您只是保存和检索键值对,可以替换为:

 prefs = PreferenceManager.getDefaultSharedPreferences(this); 

使用:

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

请确保为新实现使用正确的文件名,否则您的用户将无法访问保存在getDefaultSharedPreferences中的所有内容!以下是getDefaultSharedPreferences使用的文件名获取方式:
getPackageName() + "_preferences"

2
这是一个好答案,因为 context.getPackageName() 在模块中同样适用并检索应用程序ID。 - Robert
2
还要注意:这是针对Java而不是Kotlin的。在Kotlin中,它看起来会像是getSharedPreferences(applicationContext.packageName, Context.MODE_PRIVATE)。 - James Smith
3
避免不必要地使用androidx.preference.PreferenceManager来访问getDefaultSharedPreferences的好方法。 - A.J.
2
如果您从活动外部调用它,请使用"context.getSharedPreferences(context.packageName, Context.MODE_PRIVATE)"。 - Angel Koh

12

使用Jetpack DataStore,它是一种数据存储解决方案,可以使用协议缓冲区存储键值对或类型化对象。DataStore使用Kotlin协程和Flow异步、一致和事务性地存储数据。

如果您目前正在使用SharedPreferences存储数据,请考虑迁移到DataStore。

设置

dependencies {
        implementation "androidx.datastore:datastore:1.0.0"
}

它还支持RxJava2和RxJava3。


2
有时我们只有一个选择,那就是SharePreferences。例如,当您使用第三方库并将SharePreferences作为参数传递到某个方法中时。Open Street Map配置加载方法就是这种情况。 - Reyhane Farshbaf

3

PreferenceManager 的引用来自 文档

在 API 级别 29 中,此类已被弃用。
请使用 AndroidX Preference 库以确保在所有设备上具有一致的行为。关于如何使用 AndroidX Preference 库的更多信息,请参见设置


42
原始版本有什么不一致之处? - android developer

3

Kotlin库

implementation 'androidx.preference:preference-ktx:1.1.1'

Kotlin使用

Configuration.getInstance().load(this, androidx.preference.PreferenceManager.getDefaultSharedPreferences(this))

2

是的,这已经被弃用了。

为了确保在所有设备上具有一致的行为,请使用AndroidX首选项库。有关使用AndroidX首选项库的更多信息,请参见“设置”。

按照以下步骤操作 -

PreferenceManager

注:Original Answer的意思为“最初的回答”。

1
您可以在应用级别的 gradle 中导入此库。
implementation "androidx.preference:preference-ktx:1.1.1"

然后从创建“PreferenceManager”的类中删除导入的文件,按Alt+Enter并导入androidx,希望您能获得最新版本的偏好设置管理器。

1
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)

0
你需要像这样导入androidx库
import androidx.preference.PreferenceManager

对于Kotlin DSL:
implementation("androidx.preference:preference:1.2.1")

对于KSP:
implementation("androidx.preference:preference-ktx:1.2.1")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接