getPreferences始终返回默认值

Krø*_*lle 3 android sharedpreferences

我已经设置了PreferenceFragment两个布尔首选项.在Fragment当应用程序被关闭并重新打开,做工精细和设置存储.但是,在尝试阅读这些值时,我遇到了问题; 仅返回默认值.如果我调试getBoolean方法,SharedPreferences我看到本地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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现这很奇怪,因为偏好值显然是存储并正确加载到PreferenceFragment.我错过了什么?

Activity.onCreate():

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我的PreferenceFragment班级:

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

现在,在应用程序中的任何位置执行此操作,仅返回默认值(在两种情况下均为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);
Run Code Online (Sandbox Code Playgroud)

Krø*_*lle 7

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

在我的情况下,解决方案是使用PreferenceManager.getDefaultSharedPreferences(Context context).这是因为我使用自定义库来向后兼容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.

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

getDefaultSharedPreferences和getSharedPreferences之间的区别

PreferenceManager.getDefaultSharedPreferences()vs getPreferences()