【发布时间】:2012-05-30 11:23:44
【问题描述】:
假设我有一个应用程序将首选项保存到两个文件中,preferences1.xml 和 preferences2.xml。然后,我可以使用以下代码检索对相应对象的引用:
SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);
通过这种方式,我可以操纵两者的首选项并注册监听器以对两者进行更改。
我对这两个文件的初始化有些疑惑,用setDefaultValues:
问题 1 - PreferenceFragment 上下文:我创建了一个 PreferenceActivity,其中包含两个 PreferenceFragment 并在 onCreate 内每个方法我执行以下代码(片段 1 和 2 用 1 和 2 替换 X):
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 - 标准 Activity 上下文:当我启动我的应用时,PreferenceActivity 不是第一个启动的 Activity,用户可能永远不会打开它,所以我会想在主 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 中,我只是想初始化这两个文件......有什么帮助吗?我希望我已经发布了一个明确的问题,即使太长了。
【问题讨论】:
-
@crazymaik 我已经删除了我的答案,因为我认为它不能令人满意地回答这个问题。到目前为止,我已经花了几个小时来研究这个问题,但它仍然是一个完全的谜……希望其他人能对此有所了解。
-
你能在 SO Chat 上解释更多吗?
-
尝试在单个物理文件中使用 .Namespace 前缀来管理单个文件句柄中的 2 个逻辑集或首选项类别。您各自的片段应该能够以不会对 pref 属性上的 CRUD 操作造成太大破坏的方式应用 NS 前缀。
标签: android android-activity sharedpreferences android-preferences preferenceactivity