2011-06-09 68 views
2

我有一個「活動」從SharedPreferences讀取一些值,並在TextView顯示出來,然後我打電話「活動B」表示從SharedPreferences價值得到更新並寫回SharedPreferences。最後,我通過按下後退按鈕返回「活動a」,現在應該從SharedPreferences中讀取新的(更新的)值並在TextView中顯示。但問題來了,剛剛從SharedPreferences讀取的值仍然沒有更新(不是由活動b設置的新值)(從logcat輸出得到的),這是怎麼回事? SharedPrefs是否需要某種手動刷新?安卓:活動繼續更新SharedPrefereces不起作用

如果我重新啓動「活動a」,一切正常,新值正確顯示。怎麼了?

我將該方法稱爲「活動a」中的onResume(),並顯示其值。

我也嘗試重新實例化SharedPrefs對象(與getSharedPreferences()),但它也沒有幫助。

在此先感謝!

+2

沒有活動B犯? – Snicolas 2011-06-09 13:32:36

+0

是的,它肯定寫入到SharedPref中,因爲顯示了新的值,但只有在活動/應用程序重新啓動後。 – iDroid 2011-06-09 13:37:59

+0

嗯那麼getSharedPreferences()只在onCreate registerOnSharedPreferenceChangeListener和onDestroy中的unregiser 並在Listener中進行更改? – Selvin 2011-06-09 13:47:34

回答

1

您是否在調用活動b中的commit()方法來保存新值。

比如像:

SharedPreferences customSharedPreference = getSharedPreferences("abcprefs", 0); 
SharedPreferences.Editor editor = customSharedPreference.edit(); 
editor.putString("key", "val"); 
editor.commit(); 

其次,你可以發送到活動B之前完成()的活動,然後從活動的活性巴新實例將被創建和的onCreate()會調用。

或者,您可以刷新onStart()中的首選項,因爲發送到活動b時您的活動可能「不再可見」。

請參閱http://developer.android.com/guide/topics/fundamentals/activities.html以查看活動生命週期。

1

SharedPreferences不是活動

使用IntentActivity.startActivityForResult之間共享數據。在這裏看到我的答案 Get the intent object in an activity

+0

我知道,但我需要將值存儲在SharedPrefs中,以便應用程序中的每個活動都可以查詢它們 – iDroid 2011-06-09 13:39:00

0

確保您在每項活動中都使用相同的首選項:如果您使用getSharedPreferences,則應指定文件和訪問級別。在你的情況下,這聽起來像getDefaultSharedPreferences將是要走的路。

此外,請確保您不僅設置喜好,但也犯了變化:

SharedPreferences preferences = getDefaultSharedPreferences(this); 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putString("key", "value"); 
editor.commit(); 

,然後在你的其他活動:

SharedPreferences preferences = getDefaultSharedPreferences(this); 
boolean myPreference = preferences.getBoolean("key", defaultValue); 

這會更容易如果您發佈有問題的代碼,可以提供幫助;如果您仍然無法使用它,我會嘗試將其添加到您的帖子中。

0

還值得注意的是,每次調用preference時,preference.edit()都會返回一個不同的SharedPreferences.Editor,因此將編輯器存儲到單獨的變量中很重要,用它來寫出首選項,然後提交該編輯器。例如。這是行不通的:

myPrefs.edit().putInt("pref", 1); 
myPrefs.edit().putBoolean("pref", true); 
myPrefs.edit().commit(); 

它需要(如已被證實):

SharedPreferences myPrefs = getSharedPreferences("pref_name", Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = myPrefs.edit(); 
editor.putInt("pref", 1); 
editor.putBoolean("pref", true); 
editor.commit();