21

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

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

通过这种方式,我可以操纵两者的偏好并注册监听器以进行两者的更改。

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

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

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

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

我已经看到两个片段在启动时都使用默认值正确设置了它们的首选项。但是,鉴于我只能在应用程序的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); 

对于两个首选项文件我应该怎么做?我无法执行以下操作,因为我无法像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中,我只是想初始化这两个文件......有什么帮助吗?我希望我已经发布了一个明确的问题,即使太长了。

4

3 回答 3

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();
    }

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

对于你的第二个问题:

创建一个 Global 类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);
于 2014-02-22T13:22:03.030 回答
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

于 2014-02-03T19:26:16.787 回答
-3

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

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

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

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

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

于 2012-11-16T03:49:32.117 回答