Android首选项:如何在用户未使用首选项屏幕时加载默认值?

Pet*_*rdk 109 android default preferences

我正在使用PreferenceActivity让用户设置一些值.我正在使用定义的首选项为xml文件提供它.

android:defaultValue=""为他们设置了全部.

当我启动我的应用程序时,我需要首选项,或者如果它们尚未手动设置,我想要默认值:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 
Run Code Online (Sandbox Code Playgroud)

但是,当android:defaultValue="true"我还是得到的时候false.因此,看起来XML中设置的defaultValues不会在初始化首选项屏幕时使用.

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

pix*_*xel 161

这个问题与我的相似:

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

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

PreferenceManager.setDefaultValues(this, R.xml.preference, false);
Run Code Online (Sandbox Code Playgroud)

它将从XML加载您的首选项,最后一个参数(readAgain)将保证不会覆盖用户首选项.

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

  • 将`readAgain`设置为true与被覆盖的用户首选项无关.来自Javadoc:_Note:这不会将首选项重置为默认值._ (10认同)
  • 此外,如果您的应用程序有多个入口点,请将其放在`Application`的`onCreate()`中. (8认同)
  • 如果使用布尔值并默认为"false",则不起作用,因为在Android 2.x中将不会创建默认条目.对".getBoolean(KEY,true)"的调用将始终返回true.对于Android 4.x,它的工作原理. (2认同)

Fra*_*amo 27

请注意,如果您正在使用
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);

我希望这可以帮助别人.


Ste*_*ing 12

在Pixel的接受答案中:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);
Run Code Online (Sandbox Code Playgroud)

据说,false默认值不会被覆盖.这不是它的功能,如果您的应用程序有多个入口点,它只是一个停止解析的效率标志.遗憾的是,每个首选项文件都没有进行测试,因此如果您有多个首选项文件,则必须true在除第一个之外的所有文件上进行编码.

如果您担心效率,可以编写类似的代码.

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();
}
Run Code Online (Sandbox Code Playgroud)

如果您添加了更多共享首选项,只需将SPL设置为高数字即可.

  • 作为替代方案,您始终可以创建仅用于设置默认值的批量首选项.xml.例如,如果您有`R.xml.prefs_device`,`R.xml.prefs_test`和`R.xml.prefs_admin`.您可以创建一个包含上述所有首选项的prefs文件:`R.xml.prefs_for_loading_default_values`.然后使用`PreferenceManager.setDefaultValues(this,R.xml.prefs_for_loading_default_values,false); (2认同)