我遇到与this thread相同的问题,默认值未针对偏好进行初始化,
我有2个preference.xml文件
这是我主要活动的onCreate:
protected void onCreate(Bundle savedInstanceState) {
PreferenceManager.setDefaultValues(this,R.xml.preference,false);
PreferenceManager.setDefaultValues(this,R.xml.other_preference,false);//this doesn't work now because of the previous row
String value = PreferenceManager.getDefaultSharedPreferences(this).getString("pref_from_other_preference", null); //this returns null
}
我的问题是,如果我将readAgain
设置为false(因此它不会覆盖用户选择的首选项)
只有第一次调用此方法才会被执行。
如何为我的所有偏好xml设置默认值?
编辑:我试过一个" hack"对于一个解决方案,即尝试获取具有默认值的值,如果为null,则将getDefaultSharedPreferences
调用readAgain
作为true
。并且它不起作用(只有第一次调用初始化其值)
答案 0 :(得分:1)
我相信这是框架中的某种错误。如果看一下代码,您会发现对PreferenceManager.setDefaultValues
的第一次调用将KEY_HAS_SET_DEFAULT_VALUES
设置为true
。此后,除非您将PreferenceManager.setDefaultValues
设置为readAgain
,否则对true
的任何其他调用都将被忽略。
这一单个标志与以下事实相矛盾:我们现在需要创建单独的XML文件,每个设置片段一个。并在执行时多次调用此方法。我仍然没有找到解决方法。因此,目前唯一的解决方案是始终将readAgain
设置为true
进行呼叫。
顺便说一句,这是参数readAgain
的唯一用途。存储设置后,即使将PreferenceManager.setDefaultValues
设置为readAgain
,也无法通过方法true
来更改值。如果要在调用此方法时更改值,则需要先清除存储的值。
答案 1 :(得分:0)
请注意此方法的docs说:
注意:这不会将首选项重置为默认值。对于该功能,请使用getDefaultSharedPreferences(Context)并清除它,然后调用此方法并将此参数设置为true。
因此,您需要清除默认首选项管理器中的所有首选项才能使用此方法。
重置我的首选项时,我根本不使用此方法(因为我只需要重置首选项的子集,而不是所有首选项)。相反,我设置了我打算重置为null的首选项的值。我还使用SharedPreferences.getXXX方法中的第二个参数来传递我将首选项设置为null
时可用的默认值。
例如,
默认资源:
<bool name="myPrefDefault">true</bool>
偏爱:
<CheckBoxPreference
android:key="myPrefKey"
android:title="My Pref Title"
android:summary="My Pref Summary"
android:defaultValue="@bool/myPrefDefault" />
爪哇:
//this returns whatever preference was set for myPrefKey in PreferencesPage or the default value if nothing was set
sharedPreferences.getBoolean("myPrefKey", getResources().getBoolean(R.bool.myPrefDefault));
//this effectively resets the myPrefKey to its default value
sharedPreferences.edit().remove("myPrefKey").commit();
答案 2 :(得分:0)
您可以删除应重置为默认值的键,并在调用方法PreferenceManager.setDefaultValues()时删除。因此,这些键将使用默认值创建。
sharedPreferencesEditor= PreferenceManager.getDefaultSharedPreferences(context).edit();
//this delete myPrefKey key
sharedPreferencesEditor.remove("myPrefKey").commit();
//this creates keys which didn't exist with defaul values.
//myPrefKey isn't exist so it will be created
PreferenceManager.setDefaultValues(this,R.xml.preference,false);
答案 3 :(得分:0)
方法PreferenceManager.setDefaultValues(...)在从指定的xml设置defaultValues后,基本上将布尔键 KEY_HAS_SET_DEFAULT_VALUES(=“ _has_set_default_values”)存储在同名的单独SharedPreferences文件中。
这是我的工作-
@Override
protected void onCreate (@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setDefaults();
//.......
}
private void setDefaults () {
//This will check if defaults have been set ever before
if (!getSharedPreferences(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES, Context.MODE_PRIVATE)
.getBoolean(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES, false)) {
PreferenceManager.setDefaultValues(this, R.xml.preferences, true);
PreferenceManager.setDefaultValues(this, R.xml.other_preference1, true);
PreferenceManager.setDefaultValues(this, R.xml.other_preference2, true);
}
}
在调用此方法之前检查KEY_HAS_SET_DEFAULT_VALUES的值可确保仅在首次启动应用程序时调用此方法。 但是正如Héctor Júdez Sapena所指出的,一旦设置了值,该方法就无效。因此,始终使用readAgain = true调用也不会造成伤害。
要将所有偏好设置重置为默认设置-
PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply();
PreferenceManager.setDefaultValues(context, R.xml.preferences, true);
PreferenceManager.setDefaultValues(context, R.xml.other_preference1, true);
PreferenceManager.setDefaultValues(context, R.xml.other_preference2, true);
或
PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply();
context.getSharedPreferences(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES, Context.MODE_PRIVATE)
.edit()
.putBoolean(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES, false)
.apply();
//restart application
请注意,这里我们仅处理Default SharedPreferences文件。如果您有多个SharedPreferences文件,则需要为每个文件调用this。