1

我正在努力恢复我在preferences.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;
        }
    });

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

参数

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

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

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

    addPreferencesFromResource(R.layout.preferences);

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

编辑: 在我被要求之前,这里是preferences.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>
4

1 回答 1

0

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

这是一个有趣的注释:检查 Preference 类显示它有一个名为的字段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()) 更新每个首选项。

于 2012-05-17T05:23:03.277 回答