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。