【问题标题】:Android: PreferenceManager vs Context.getSharedPreferences() and why the latter failed meAndroid:PreferenceManager vs Context.getSharedPreferences() 以及为什么后者让我失望
【发布时间】:2016-01-04 07:54:13
【问题描述】:

好的,在 Udacity Android 开发课程之后,我到达了希望访问保存到名为 pref_general.xml 的 sharedPreferences 文件中的邮政编码的部分,该文件以字符串类型保存邮政编码并连接到一个键通过键值对调用位置。

我解决此问题的方法是使用 getSharedPreferences() 方法按名称获取文件。虽然这似乎不会导致问题,因为文件没有变成空值,但尝试检索邮政编码导致无法通过键找到值并确定参数的给定默认值。

SharedPreferences appPreferences = getActivity().getSharedPreferences("pref_general", Context.MODE_PRIVATE);
        if(appPreferences == null) {
            Log.v("ERRORTAG", "Cannot get sharedPreferences file");
        }
        String getPostal = appPreferences.getString(getString(R.string.pref_location_key), "0");
        Log.v("ERRORTAG", getPostal);

logcat 上的第二个详细语句导致默认字符串值 0,而不是与给定键 94043 邮政编码绑定的值。

现在 Udacity 给出的答案是使用 PreferenceManager,它获取与 Activity 绑定的默认单独的 sharedPreferences 文件

SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());

文件不为空,并且检索到的邮政编码是在 sharedPreference 文件中设置为键值对的给定默认邮政编码 94043。

我想了解为什么我的方法不起作用;它非常接近。唯一的区别是文件的访问方式。请给我一个解释为什么。谢谢。

【问题讨论】:

  • 显示您在其中创建pref_general 文件并在其中存储邮政编码的代码。
  • 附带说明,我希望 Udacity 没有教你将字符串常量放入 strings.xml。这适用于可本地化的 UI 字符串。
  • Udacity 告诉我们使用已弃用的方法通过 SettingsActivity 添加首选项,以针对 Gingerbread OS 设备。话虽如此,邮政编码的字符串常量实际上是通过 pref_general.xml 中的 android:defaultValue 作为 xml 属性创建的,并且它的字符串与 strings.xml 相关联,这显然是您反对的。可本地化的 UI 字符串是什么意思?
  • addPreferencesFromResource(R.xml.pref_general); bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key)));
  • strings.xml 用于将针对不同语言环境翻译成不同语言的字符串。有一些讨论here

标签: android xml sharedpreferences android-sharedpreferences


【解决方案1】:

PreferenceActivity 的文档说:

如果您在旧模式下使用 PreferenceActivity,则文档 [for PreferenceFragment] 适用于此处已弃用的 API。

PreferenceFragment 的文档解释了发生了什么:

要检索此片段中的首选项层次结构将使用的 SharedPreferences 实例,请使用与此片段相同的包中的上下文调用 getDefaultSharedPreferences(android.content.Context)。

这表明PreferenceActivity#addPreferencesFromResource(...) 不会创建与原始文件同名的SharedPreferences 文件。相反,它将文件合并到默认的共享首选项中。 pref_general 文件不存在,当您尝试从中读取时,您基本上是在创建它。 (尽管在您编辑它之前它实际上并没有在磁盘上创建。)

【讨论】:

  • 啊,如果它确实合并到一些不是 pref_general.xml 的默认共享首选项文件中,那是有道理的。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多