2015-10-07 16 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

相關問題