我正在努力恢复我在首选项中指定的默认值.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/
我只能假设这与我创建活动时提供的 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()
( 更新每个首选项。