Nic*_*ick 1 android preferences
我有一个PreferenceActivity,从一个看起来像这样的XML文件加载它的首选项
<?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>
Run Code Online (Sandbox Code Playgroud)
我想将货币类型和目标都传递回主类,我发现的所有解释都非常模糊.在我的主类的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);
}
Run Code Online (Sandbox Code Playgroud)
这真的很令人沮丧,我很想知道SharedPreferences的工作原理.谢谢!
SharedPreferences是一种在应用程序的许多部分之间共享数据的方法.一旦有人引用共享偏好,他们就可以从中读取内容,如下所示:
int currlist = prefs.getInt("currlist", 0);
float goal = prefs.getFloat("goaltxt", 0);
Run Code Online (Sandbox Code Playgroud)
他们还可以注册接收数据已更改的通知:
prefs.registerOnSharedPreferenceChangeListener(this);
Run Code Online (Sandbox Code Playgroud)
onSharedPreferenceChanged当有人更改共享首选项中的数据时,他们的方法将触发(SharedPreferenceChangedListener当然,他们必须实现接口).一旦不再观察数据集,请记得取消注册.
它如何知道偏好何时发生变化?好吧,您必须先获得对a的引用,SharedPreferences.Editor然后才能编辑内部数据SharedPreferences,就像您所做的那样:
final SharedPreferences.Editor prefsEditor = prefs.edit();
Run Code Online (Sandbox Code Playgroud)
此时,您使用编辑器添加或更新共享首选项中存储的某些变量:
prefsEditor.putInt("currlist", 1);
Run Code Online (Sandbox Code Playgroud)
当您完成编辑后,您提交更改,这将通知所有听众已发生更改:
prefsEditor.commit();
Run Code Online (Sandbox Code Playgroud)
此时,将通知所有已注册的观察者共享首选项(包括您自己的!)的更改.
如何使用:
当您的应用程序,活动,服务或其他内容启动时,请获取您感兴趣的共享首选项的引用,将所需的所有值复制到类成员变量中并将自己注册为观察者.
请记住,当您的班级不再处于活动状态和/或收听更改事件时,请删除该监听器.
在您的onSharedPreferenceChanged方法中,检查值prefs.getWhatever("value", default)是否与您的类成员变量不同.如果是,请采取行动,但要注意这可能是从另一个线程调用的 ; 你不能从UI线程外部编辑UI或者事情会崩溃,同样你不希望在UI线程上造成延迟或者它会挂起.只做非常快速的本地工作(向队列添加内容等)并确保编写线程安全代码.
当您更改某个共享值时,首先更改您的类成员变量,然后获取prefs编辑器,对变量和commit()结果进行更改.您的本地onSharedPreferenceChanged侦听器将触发,但由于该值与您的成员变量相同,您将忽略它.
从这一点开始,您的类间通信是可靠的,对prefs进行更改并且UI无缝更新,向正在运行的服务发送更新,在不相关的活动之间传递值.
| 归档时间: |
|
| 查看次数: |
6011 次 |
| 最近记录: |