设置多个SharedPreferences实例/文件的默认值

Gia*_*nzi 21 android preferenceactivity android-preferences sharedpreferences android-activity

假设我有一个应用程序将首选项保存到两个文件,preferences1.xmlpreferences2.xml.然后,我可以使用以下代码检索对相应对象的引用:

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以操纵两者的首选项并注册侦听器以获取两者的更改.

我对这两个文件的初始化有一些疑问,使用setDefaultValues:

问题1 - PreferenceFragment上下文:我已经创建了一个PreferenceActivity具有两个PreferenceFragments和内的onCreate每一个I执行下面的代码的方法(与图1和2为取代片段1 X和2):

PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");

PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);
Run Code Online (Sandbox Code Playgroud)

我已经看到两个片段在启动时都正确地设置了它们的默认值.但是,鉴于我在应用程序的shared_prefs目录中只能看到一个_has_set_default_values.xml文件,它是如何理解属性的preferences1.xmlpreferences2.xml已经设置好了吗?只要在第一个打开的PreferenceFragment中调用setDefaultValues就会创建此文件,但即使在此之后,如果我打开第二个PreferenceFragment,它也会正确初始化默认值.如何理解它尚未初始化preferences2.xml以及_has_set_default_values.xml的目的是什么,因为它不包含有关哪些优先文件已被初始化的信息?

问题2 - 标准活动上下文:当我启动我的应用程序时,PreferenceActivity不是第一个启动的活动,用户可能永远不会打开它,所以我想在主Activity中初始化两个首选项文件及其默认值,我怎样才能做到这一点?对于默认的共享首选项,很容易:

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

对于两个首选项文件,我该怎么办?我无法执行以下操作,因为我无法在PreferenceFragment类中检索PreferenceManager的实例:

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences1");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment1, false);

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences2");            
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment2, false);
Run Code Online (Sandbox Code Playgroud)

在主Activity中,我不需要更改PreferenceManager工作的选项文件,因为我们不在PreferenceActivity中,我只想初始化这两个文件......任何帮助?我希望我已经发布了一个明确的问题,即使这个问题太长了.

Rob*_*ill -3

1)我猜测只有使用 getDefaultSharedPreferences() 方法时才会加载这些默认值,如果您提供自己的首选项文件,这些默认值将被忽略。对此不太确定。

2) 您可以将它们设置在应用程序子类上。

http://developer.android.com/reference/android/app/Application.html

Application.onCreate 是用户启动应用程序时首先执行的事情。它是应用程序的单入口点,因此是初始化应用程序在系统范围内所需的所有数据的好地方。

由于 Application 扩展了 ContextWrapper,因此您可以通过 getSharedPreferences(file, mode) 方法访问 SharedPreferences。您可以使用它来检索您的两个首选项文件。