2015-10-07 101 views
1

没问题,在Udacity Android Development Course之后,我到达了我希望访问保存到名为pref_general.xml的sharedPreferences文件的邮政编码的部分,邮政编码保存为字符串类型,并通过键值对连接到称为位置的键。Android:PreferenceManager vs Context.getSharedPreferences()以及为什么后者让我失败

我对问题的解决方法是使用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,它抓住默认孤独sharedPreferences文件捆绑到活动

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

该文件不为空,并将检索邮政编码是违约邮政编码94043在sharedPreference文件中设置为键值对。

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

+0

显示您创建'pref_general'文件的代码并将邮政编码存储在其中。 –

+0

在附注中,我希望Udacity不会教你将字符串常量放入'strings.xml'中。这是可本地化的UI字符串。 –

+0

Udacity告诉我们使用已弃用的方法来通过SettingsActivity添加首选项,以便定位Gingerbread操作系统设备。也就是说,邮政编码的字符串常量实际上是通过pref_general.xml中的android:defaultValue创建的xml属性,并且它的字符串绑定到strings.xml显然是您所反对的。本地化的UI字符串是什么意思? – kthieu

回答

2

PreferenceActivity文档说:

如果在旧模式下使用PreferenceActivity,文档[为PreferenceFragment】适用于这里弃用API。

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

要在上下文检索SharedPreferences,在这个片段中的优先层级会使用,通话getDefaultSharedPreferences(android.content.Context)的实例与此片段相同的包。

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

+0

啊,如果它合并到一些不是pref_general.xml的默认共享首选项文件中,这是有道理的。 – kthieu