getPreferences始终返回默认值

时间:2015-08-14 14:38:59

标签: android sharedpreferences

我已经设置了一个带有两个布尔首选项的PreferenceFragmentFragment工作正常,应用关闭并重新打开时会存储设置。但是,在尝试阅读这些值时,我遇到了问题;仅返回默认值。如果我调试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

1 个答案:

答案 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实例,该实例指向首选框架在给定上下文中使用的默认文件。

因此,这是使用首选项的默认文件名随时为给定ContextActivity的首选项。这是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()