我已经设置了一个带有两个布尔首选项的PreferenceFragment
。 Fragment
工作正常,应用关闭并重新打开时会存储设置。但是,在尝试阅读这些值时,我遇到了问题;仅返回默认值。如果我调试getBoolean
的{{1}}方法,我看到本地SharedPreferences
的大小为0,因此会返回默认值,如下所示:
HashMap
我发现这很奇怪,因为偏好值显然已经存储并正确加载到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()
RES / XML /的preferences.xml:
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
我的<?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
现在,在app中的任何位置执行此操作,只返回默认值(两种情况都为true),即使public class MiasMatPreferencesFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
显示值设置为false(如果是):
PreferenceFragment
答案 0 :(得分:7)
在摆弄了几个小时之后,我想出了为什么这对我不起作用的原因。单个应用程序中有几个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)
获取一个SharedPreferences实例,该实例指向首选框架在给定上下文中使用的默认文件。
因此,这是使用首选项的默认文件名随时为给定Context
或Activity
的首选项。这是PreferenceManager
类的静态实例。
Context.getSharedPreferences(String name, int mode)
检索并保存首选项文件“name”的内容,返回SharedPreferences,您可以通过它来检索和修改其值。只有一个SharedPreferences对象实例返回给任何相同名称的调用者,这意味着他们一旦完成就会看到彼此的编辑。
使用此方法,您可以使用String
参数区分多个首选项文件。
Activity.getPreferences(int mode)
检索SharedPreferences对象以访问此活动专用的首选项。
此方法直接调用上一个:getSharedPreferences(getLocalClassName(), mode)
。因此,它指向一个文件,具体取决于Activity
的名称。
其他相关问题(可能重复):
Difference between getDefaultSharedPreferences and getSharedPreferences
PreferenceManager.getDefaultSharedPreferences() vs getPreferences()