>假设我有一个应用程序将首选项保存到两个文件上,首选项 1.xml 和首选项 2.xml。然后,我可以使用以下代码检索对相应对象的引用:
SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);
通过这种方式,我可以操纵两者的首选项,并为两者的更改注册侦听器。
我对这两个文件的初始化有一些疑问,使用setDefaultValues:
问题 1 - PreferenceFragment 上下文:我创建了一个包含两个 PreferenceFragment 的 PpreferencesActivity,在每个 onCreate 方法中,我执行以下代码(将 X 替换为片段 1 和 2 的 1 和 2):
PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);
我已经看到两个片段在启动时都使用默认值正确设置了它们的首选项......但是,鉴于我只能在应用程序的shared_prefs目录中看到一个_has_set_default_values.xml文件,它如何理解首选项 1.xml 和首选项 2.xml 的属性何时已经设置?一旦在第一个打开的首选项片段中调用 setDefaultValues,就会创建此文件,但即使在此之后,如果我打开第二个 PreferenceFragment,它也会正确初始化默认值。它如何理解它尚未初始化首选项2.xml鉴于它不包含有关哪些首选文件已初始化的信息,_has_set_default_values.xml的目的是什么?
问题 2 - 标准活动上下文:当我启动我的应用程序时,首选项活动不是第一个启动的活动,用户可能永远不会打开它,因此我想在主活动中使用它们的默认值初始化两个首选项文件,我该怎么做?对于默认的共享首选项,很容易:
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);
在主活动中,我不需要更改首选项管理器将在其上运行的首选项文件,因为我们不在首选项活动中,我只想初始化这两个文件......有什么帮助吗?我希望我已经发布了一个明确的问题,即使太长了。
您可以创建如下首选项:
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
我相信_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
1)我猜这些默认值只会在使用getDefaultSharedPreferences()方法时加载,如果您提供自己的首选项文件,则会被忽略。不太确定这个。
2) 您可以在应用程序子类上设置它们。
http://developer.android.com/reference/android/app/Application.html
Application.onCreate 是用户启动应用时要执行的第一件事。它是应用的单一入口点,因此是初始化应用在系统范围内所需的所有数据的好地方。
由于应用程序扩展了 ContextWrapper,因此您可以通过 getSharedPreferences(file, mode) 方法访问 SharedPreferences。您可以使用它来检索两个首选项文件。