几个xml首选项的PreferenceManager.setDefaultValues()

时间:2014-10-22 17:34:28

标签: android android-preferences

我遇到与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。并且它不起作用(只有第一次调用初始化其值)

4 个答案:

答案 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