2010-11-01 79 views
1

Android的SharedPreferences我有一個從它看起來像這樣從PreferenceActivity

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:key="first_preferencescreen"> 
    <ListPreference 
android:key="currlist" 
    android:title="Change Currency" 
    android:summary="Selecting a new currency will reset your jar!" 
    android:entries="@array/currencies" 
    android:entryValues="@array/currency_vals" /> 
    <EditTextPreference 
    android:key="goaltxt" 
    android:title="Set Goal" 
    android:inputType="numberDecimal" 
    android:text="0.00" 
    /> 
</PreferenceScreen> 

我想通過這兩種貨幣類型和目標回主類的XML文件加載其偏好的PreferenceActivity,所有的我發現的解釋非常模糊。在我在onStart()在我的主類中的方法我有這個至今:

public void onStart() { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE); 
    final SharedPreferences.Editor prefsEditor = myPrefs.edit(); 

    prefs.getInt("currlist", 0); 
    prefs.getFloat("goaltxt", 0); 


} 

這真是令人沮喪,我喜歡上SharedPreferences是如何工作的一些見解。謝謝!

+0

重複與解釋在這裏http://stackoverflow.com/questions/2614719/how-do-i-get-the-sharedpreferences-from-a-preferenceactivity-in-android – 2010-11-02 00:05:10

回答

9

SharedPreferences是在應用程序的許多部分之間共享數據的一種方式。一旦有人來共享偏好的參考,他們可以讀取它的東西,像這樣:

int currlist = prefs.getInt("currlist", 0); 
float goal = prefs.getFloat("goaltxt", 0); 

他們還可以註冊以接收該數據已更改的通知:

prefs.registerOnSharedPreferenceChangeListener(this); 

他們onSharedPreferenceChanged方法將火當有人更改共享首選項中的數據(當然,他們必須實現SharedPreferenceChangedListener接口)。記住一旦你不再觀察數據集就取消註冊。

它是如何知道偏好何時發生變化的?那麼,你必須得到一個SharedPreferences.Editor參考之前您可以編輯SharedPreferences裏面的數據,像你這樣做:

final SharedPreferences.Editor prefsEditor = prefs.edit(); 

此時你使用編輯器添加或更新存儲在共享偏好一些變量:

prefsEditor.putInt("currlist", 1); 

大功告成編輯您提交更改時,這將通知所有的聽衆一個變化發生了:

prefsEditor.commit(); 

在這一點上,所有註冊的觀察者將被告知出現了一個變化的共享偏好

如何把這個使用(包括你自己!):

  1. 當你的應用程序,活動,服務或任何其他開始,抓住你感興趣的共享偏好的引用,將你需要的所有值複製到類成員變量中,並將自己註冊爲觀察者。

  2. 記住當你的課程不再活動和/或正在監聽改變事件時,移除監聽器。

  3. 在您的onSharedPreferenceChanged方法中,檢查prefs.getWhatever("value", default)中的值是否與您的類成員變量不同。如果是,請採取行動但請注意,這可能是從另一個線程調用;你不能從UI線程外部編輯UI,否則事情會崩潰,類似的,你不想在UI線程上造成延遲,或者它會掛起。只做非常快的本地工作(將東西添加到隊列等),並確保編寫線程安全代碼。

  4. 當您更改某些共享的值時,首先更改您的類成員變量,然後獲取一個prefs編輯器,對該變量進行更改,並將結果更改爲commit()。您的本地onSharedPreferenceChanged偵聽器將觸發,但由於該值與您的成員變量相同,您將忽略它。

從你的級間通信這一點是固體,做出改變的首選項和用戶界面無縫更新,更新發送到運行服務,不相關的活動之間來回傳遞值。