2

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

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

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。

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

4

1 回答 1

2

文档PreferenceActivity说:

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

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

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

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

于 2015-10-07T08:24:30.477 回答