Android偏好设置:如何在用户没有使用偏好设置屏幕时加载默认值?

我正在使用PreferenceActivity让用户设置一些值。 我给它的XML文件与定义的首选项。

我已经为他们设置了所有的android:defaultValue=""

当我开始我的应用程序,我需要首选项,或者如果他们还没有手动设置,我想要的默认值:

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); boolean value = prefs.getBoolean("key"), false); 

但是,当android:defaultValue="true"我仍然是false 。 所以,它看起来像在XML中设置的defaultValues不会在任何地方使用,但初始化首选项屏幕。

我不想在getBoolean()方法中对默认值进行硬编码。 那么,有没有办法获得默认值,只有在1个地方定义这些?

这个问题类似于我的:

初始化-偏好-从XML的function于主要活动

只需在onCreate方法中使用此代码:

 PreferenceManager.setDefaultValues(this, R.xml.preference, false); 

它会从XML加载你的参数,而最后一个参数( readAgain )将保证用户参数不会被覆盖。

查看Android API中的PreferenceManager.setDefaultValues以进一步调查。

请注意,如果你正在使用
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

检索您必须使用的偏好
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
设置默认值!

例如:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

我希望这可以帮助别人。

在像素的接受答案:

 PreferenceManager.setDefaultValues(this, R.xml.preference, false); 

据说这个false意味着违约不会被覆盖。 这不是它所做的,它只是一个效率标志,如果您的应用程序具有多个入口点,则停止parsing。 不幸的是,这个testing不是针对每个首选项文件进行的,所以如果你有多个首选项文件,除了第一个以外,你必须对所有的首选项进行编码。

如果你担心效率,你可以编写这样的代码。

 final static private int SPL = 1; SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); if (sp.getInt("spl", 0) != SPL) { PreferenceManager.setDefaultValues(this, R.xml.prefs1, true); PreferenceManager.setDefaultValues(this, R.xml.prefs2, true); sp.edit().putInt("spl", SPL).apply(); } 

如果您添加更多的共享首选项,只需将SPL设置为一个很高的数字。

例如,扩展DialogPreference我这样做:

 @Override protected void onSetInitialValue(boolean restore, Object defaultValue) { super.onSetInitialValue(restore, defaultValue); if (restore) { mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault; } else { mValue = mDefault; } } 

mDefault可以是:

  • mContext.getResources()。getString(attrs.getAttributeResourceValue(androidns,“defaultValue”,100));
  • 你在R中索引的东西

另外请确保您以前从未使用SharedPreferences。 为了确保它们没有改变(这意味着setDefaultValues(this,xml,false)没有效果)卸载你的应用程序并再次上传,以确保没有值被触摸。 这帮助了我。