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)没有效果)卸载你的应用程序并再次上传,以确保没有值被触摸。 这帮助了我。