来自PreferenceActivity的Android SharedPreferences

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的工作原理.谢谢!

Gar*_*son 9

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)

此时,将通知所有已注册的观察者共享首选项(包括您自己的!)的更改.

如何使用:

  1. 当您的应用程序,活动,服务或其他内容启动时,请获取您感兴趣的共享首选项的引用,将所需的所有值复制到类成员变量中并将自己注册为观察者.

  2. 请记住,当您的班级不再处于活动状态和/或收听更改事件时,请删除该监听器.

  3. 在您的onSharedPreferenceChanged方法中,检查值prefs.getWhatever("value", default)是否与您的类成员变量不同.如果是,请采取行动,但要注意这可能是从另一个线程调用的 ; 你不能从UI线程外部编辑UI或者事情会崩溃,同样你不希望在UI线程上造成延迟或者它会挂起.只做非常快速的本地工作(向队列添加内容等)并确保编写线程安全代码.

  4. 当您更改某个共享值时,首先更改您的类成员变量,然后获取prefs编辑器,对变量和commit()结果进行更改.您的本地onSharedPreferenceChanged侦听器将触发,但由于该值与您的成员变量相同,您将忽略它.

从这一点开始,您的类间通信是可靠的,对prefs进行更改并且UI无缝更新,向正在运行的服务发送更新,在不相关的活动之间传递值.