Android:PreferenceManager vs Context.getSharedReferences()以及后者失败的原因

Android:PreferenceManager vs Context.getSharedReferences()以及后者失败的原因,android,xml,sharedpreferences,android-sharedpreferences,Android,Xml,Sharedpreferences,Android Sharedpreferences,好的,在Udacity Android开发课程之后,我达到了一个阶段,我需要访问保存到名为pref_general.xml的共享引用文件中的邮政编码,该文件将邮政编码保存为字符串类型,并通过键值对连接到名为location的键 我解决这个问题的方法是使用getSharedReferences()方法按名称获取文件。虽然这似乎不会导致问题,因为文件的结果不是空的,但检索邮政编码的尝试导致无法通过键找到值,并且无法确定参数的给定默认值 SharedPreferences appPreferences

好的,在Udacity Android开发课程之后,我达到了一个阶段,我需要访问保存到名为pref_general.xml的共享引用文件中的邮政编码,该文件将邮政编码保存为字符串类型,并通过键值对连接到名为location的键

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

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上的第二个verbose语句导致默认字符串值0,而不是与给定键94043邮政编码关联的值

现在,Udacity给出的答案是使用PreferenceManager,它获取绑定到活动的默认单独SharedReferences文件

SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
该文件不为null,检索到的邮政编码是SharedReference文件中作为键值对设置的给定默认邮政编码94043


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

首选项活动的文档说:

如果您在旧模式下使用PreferenceActivity,[for PreferenceFragment]文档适用于此处不推荐使用的API

用于解释发生了什么的文档:

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


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

显示您创建
pref_general
文件并在其中存储邮政编码的代码。另一方面,我希望Udacity没有教您在
strings.xml
中放置字符串常量。这是针对可本地化的UI字符串。Udacity告诉我们使用不推荐的方法通过设置活动来添加首选项,以便针对Gingerbread OS设备。也就是说,邮政编码的字符串常量实际上是通过pref_general.xml中的android:defaultValue创建为xml属性的,它的字符串绑定到strings.xml,这显然是您所反对的。可本地化的UI字符串是什么意思?addPreferencesFromResource(R.xml.pref_-general);bindPreferenceSummaryToValue(findReference(getString(R.string.pref_location_key))
strings.xml
用于针对不同地区翻译成不同语言的字符串。有一些讨论。啊,如果它确实合并到一些默认的共享首选项文件中,而该文件不是pref_general.xml,这是有意义的。