2010-11-01 81 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侦听器将触发,但由于该值与您的成员变量相同,您将忽略它。

从你的级间通信这一点是固体,做出改变的首选项和用户界面无缝更新,更新发送到运行服务,不相关的活动之间来回传递值。