Android:PreferenceManager vs Context.getSharedPreferences()以及后者为什么让我失败

时间:2015-10-07 07:28:18

标签: android xml sharedpreferences android-sharedpreferences

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

我遇到问题的方法是使用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的第二个详细语句导致默认String值为0,而不是与给定密钥94043邮政编码相关联的值。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

PreferenceActivity的文档说:

  

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

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

  

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

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