gpt4 book ai didi

android - getPreferences 总是返回默认值

转载 作者:太空宇宙 更新时间:2023-11-03 12:16:47 25 4
gpt4 key购买 nike

我已经设置了一个带有两个 bool 首选项的 PreferenceFragmentFragment 工作正常,设置会在应用程序关闭并重新打开时存储。但是,我在尝试读取这些值时遇到了问题;仅返回默认值。如果我调试到 SharedPreferencesgetBoolean 方法,我看到本地 HashMap 的大小为 0,因此返回默认值,如下所示:

public boolean getBoolean(String key, boolean defValue) {
synchronized (this) {
awaitLoadedLocked();
Boolean v = (Boolean)mMap.get(key); // <-- mMap is of size 0: return defValue
return v != null ? v : defValue;
}
}

我觉得这很奇怪,因为偏好值显然已正确存储并加载到 PreferenceFragment 中。我错过了什么?

Activity.onCreate()中:

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

res/xml/preferences.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="mm_preferences_category_recipe_preferences"
android:title="@string/mm_preferences_category_recipe_preferences_title" >
<CheckBoxPreference
android:key="@string/mm_preferences_numbers_as_fractions_key"
android:title="@string/mm_preferences_numbers_as_fractions_title"
android:summary="@string/mm_preferences_numbers_as_fractions_summary"
android:defaultValue="true" />
<CheckBoxPreference
android:key="@string/mm_preferences_comma_as_decimal_separator_key"
android:title="@string/mm_preferences_comma_as_decimal_separator_title"
android:summary="@string/mm_preferences_comma_as_decimal_separator_summary"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>

我的PreferenceFragment 类:

public class MiasMatPreferencesFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}

现在,在应用程序的任何位置执行此操作,仅返回默认值(在两种情况下均为 true),即使 PreferenceFragment 显示值设置为 false(如果是):

boolean foo = getPreferences(Context.MODE_PRIVATE).getBoolean(getString(R.string.mm_preferences_numbers_as_fractions_key), true);
boolean bar = getPreferences(Context.MODE_PRIVATE).getBoolean(getString(R.string.mm_preferences_comma_as_decimal_separator_key), true);

最佳答案

在摆弄了几个小时之后,我弄清楚了这对我不起作用的原因。单个应用程序中有多个 SharedPreferences,我没有意识到。这意味着 (1) Activity.getPreferences(int mode)、(2) Context.getSharedPreferences(String name, int mode) 和 (3) PreferenceManager。 getDefaultSharedPreferences(Context context) 返回 SharedPreferences 的不同实例。

在我的例子中,解决方案是使用 PreferenceManager.getDefaultSharedPreferences(Context context)。这是因为我使用了 custom library为了向后兼容 PreferenceFragment。该库写入默认首选项文件。

来自文档:

PreferenceManager.getDefaultSharedPreferences(Context context)

Gets a SharedPreferences instance that points to the default file that is used by the preference framework in the given context.

因此,这是给定 ContextActivity 的首选项,随时使用首选项的默认文件名。这是 PreferenceManager 类的静态实例。

Context.getSharedPreferences(String name, int mode)

Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values. Only one instance of the SharedPreferences object is returned to any callers for the same name, meaning they will see each other's edits as soon as they are made.

使用此方法,您可以使用 String 参数区分多个首选项文件。

Activity.getPreferences(int mode)

Retrieve a SharedPreferences object for accessing preferences that are private to this activity.

此方法直接调用前一个方法,如下所示:getSharedPreferences(getLocalClassName(), mode)。因此,它根据 Activity 的名称指向一个文件。

其他相关问题(可能重复):

Difference between getDefaultSharedPreferences and getSharedPreferences

PreferenceManager.getDefaultSharedPreferences() vs getPreferences()

关于android - getPreferences 总是返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com