安卓共享首选项 它意味着被使用



我正在努力恢复我在首选项中指定的默认值.xml, 这是我的代码:

    Preference reset = findPreference(res.getString(R.string.DEFAULT_PREFS));
    reset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        public boolean onPreferenceClick(Preference p) {
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Preferences.this);
            sp.edit().clear().commit();
            PreferenceManager.setDefaultValues(Preferences.this, R.layout.preferences, true);
            return true;
        }
    });

这段代码是我对 android 开发人员对函数 setDefaultValues(context, resId, readAgain( 的参考的理解:

参数

上下文

共享首选项的上下文
残油 首选项层次结构 XML 文件的资源 ID。
再次阅读 是否重新读取默认值。

注意:这不会将首选项重置回其默认值。 对于该功能,请使用 getDefaultSharedPreferences(Context( 并清除它,然后调用此方法 此参数设置为 true

好吧,它不起作用,执行此代码后首选项值是相同的。然后我查看了 SharedPreferences 变量 sp,它指向路径中系统生成的文件:
/data/data//shared_prefs/_preferences.xml
我只能假设这与我创建活动时提供的 xml 相同。

    addPreferencesFromResource(R.layout.preferences);

同样检查 sp 变量,哈希表具有所有首选项,但没有默认值字段。

编辑:在我被要求之前,这里是首选项.xml文件的摘录

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
    android:defaultValue="5000"
    android:key="@string/MAX_MESSAGES"
    android:numeric="integer"
    android:summary="@string/MAX_MESSAGES_desc"
    android:title="@string/MAX_MESSAGES_title" />
<EditTextPreference
    android:defaultValue="10"
    android:key="@string/VIEW_EDGE_ROWS"
    android:numeric="integer"
    android:summary="@string/VIEW_EDGE_ROWS_desc"
    android:title="@string/VIEW_EDGE_ROWS_title" />
<ListPreference
    android:defaultValue="0"
    android:entries="@array/level_list"
    android:entryValues="@array/level_values"
    android:key="@string/INITIAL_ORG"
    android:summary="@string/INITIAL_ORG_desc"
    android:title="@string/INITIAL_ORG_title" />
<ListPreference
    android:defaultValue="2"
    android:entries="@array/view_list"
    android:entryValues="@array/view_values"
    android:key="@string/INITIAL_VIEW"
    android:summary="@string/INITIAL_VIEW_desc"
    android:title="@string/INITIAL_VIEW_title" />
<CheckBoxPreference
    android:defaultValue="true"
    android:key="@string/AUTOSCROLL"
    android:summary="@string/AUTOSCROLL_desc"
    android:title="@string/AUTOSCROLL_title" />
<CheckBoxPreference
    android:defaultValue="true"
    android:key="@string/SEND_THEN_EXIT"
    android:summary="@string/SEND_THEN_EXIT_desc"
    android:title="@string/SEND_THEN_EXIT_title" />
<Preference
    android:key="@string/DEFAULT_PREFS"
    android:summary="@string/DEFAULT_PREFS_desc"
    android:title="@string/DEFAULT_PREFS_title" />
</PreferenceScreen>
这是我

到目前为止的解决方案。调试到 Android 源代码后,我发现setDefaultValues()不可靠并且无法按预期工作(至少根据我的期望(。
我现在手动恢复默认值。我有一个地图,我可以从默认值中获取。

这里有一个有趣的说明:检查首选项类显示它有一个名为 mDefaultValue 的字段,其中包含首选项的默认值。但是这个字段只能通过setDefaultValue()方法设置,没有方法可以获取它。这将节省我对地图的需求

这是我现在使用的代码,经过测试和工作:

    Preference reset = findPreference(getResources().getString(R.string.DEFAULT_PREFS));
    reset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        public boolean onPreferenceClick(Preference p) {
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Preferences.this);
            SharedPreferences.Editor editor = sp.edit();
            editor.clear();
            // PreferenceManager.setDefaultValues(Preferences.this, R.layout.preferences, false);
            for(int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
                restoreDefault(editor, getPreferenceScreen().getPreference(i));
            }
            editor.commit();
            return true;
        }
    }
private void restoreDefault(Editor editor, Preference p) {
    if(p instanceof PreferenceCategory) {
        PreferenceCategory pCat = (PreferenceCategory) p;
        for(int i = 0; i < pCat.getPreferenceCount(); i++) {
            restoreDefault(editor, pCat.getPreference(i));
        }
    }
    if(p instanceof ListPreference) {
        editor.putString(p.getKey(), resMap.get(p.getKey())._default);
    }
    if(p instanceof EditTextPreference) {
        editor.putString(p.getKey(), resMap.get(p.getKey())._default);
    }
    if(p instanceof CheckBoxPreference) {
        editor.putBoolean(p.getKey(), resMap.get(p.getKey())._default.equals("true"));
    }
}

另一个注意事项:editor.commit()更新首选项文件,但不更新首选项屏幕。您必须使用侦听器 ( OnSharedPreferenceChangeListener() ( 更新每个首选项。

最新更新