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

时间:2012-05-23 21:16:05

标签: android android-activity sharedpreferences android-preferences preferenceactivity

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

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);

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

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

问题1 - PreferenceFragment上下文:我在 onCreate 中创建了一个带有两个 PreferenceFragments PreferenceActivity 我执行以下代码的方法(将片段1和2替换为1和2):

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

PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);

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

问题2 - 标准活动背景:当我启动应用时, PreferenceActivity 不是第一个启动的活动,用户可能永远不会打开它,所以我会喜欢在主 Activity 中初始化两个首选项文件及其默认值,我该怎么做?对于默认的共享首选项,很容易:

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

对于两个首选项文件,我该怎么办?我无法执行以下操作,因为我无法像 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);

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

3 个答案:

答案 0 :(得分:1)

你可以像这样创建一个偏好:

public class MyPreference {

    private static final String APP_SHARED_PREFS1 = "myPrefc1"; 
    private static final String APP_SHARED_PREFS2 = "myPrefc2"; 
    private SharedPreferences   appSharedPrefs1;
    private SharedPreferences   appSharedPrefs2;
    private Editor              prefsEditor1;
    private Editor              prefsEditor2;


    public MyPreference(Context context) {
        this.appSharedPrefs1 = context.getSharedPreferences(APP_SHARED_PREFS1, Activity.MODE_PRIVATE);
        this.appSharedPrefs2 = context.getSharedPreferences(APP_SHARED_PREFS2, Activity.MODE_PRIVATE);
        this.prefsEditor1 = appSharedPrefs1.edit();
        this.prefsEditor2 = appSharedPrefs2.edit();
    }

 public void saveServices(String servicName, boolean isActivated) {
        prefsEditor1.putBoolean(servicName, isActivated);
        prefsEditor1.commit();
        prefsEditor2.putBoolean(servicName, isActivated);
        prefsEditor2.commit();
    }

在您的保存服务或其他您想要做的事情上,数据将保存在两个文件中。

并提出第二个问题:

创建一个像G

这样的全局类

然后声明您的偏好:

public class G extends Application{

    public static Activity currentActivity = null;
    public static MyPreference myAppPref = null;


    @Override
    public void onCreate() {

        super.onCreate();

         myAppPref = new MyPreference(G.this);


    }


}

当您的主要活动运行时,您应该这样做:

G.currentActivity = MainActivity.this;
G. myAppPref.saveServices("testpref", true);

答案 1 :(得分:0)

问题1

我相信 _has_set_default_values.xml 文件只是另一个首选项文件...它存储键/值对,其中键是首选项文件的名称,值是否是已设置默认值。

问题2

为什么不使用带有共享偏好文件名称的 PreferenceManager.setDefaultValues()版本?这是方法签名:

public static void setDefaultValues (Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

http://developer.android.com/reference/android/preference/PreferenceManager.html

答案 2 :(得分:-3)

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

2)您可以在Application子类上设置它们。

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

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

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