設(shè)置可接受的范圍
要將可接受的值限制在 0(不包括)和 3(包括)之間,我們選擇使用 PreferenceChangeListener - 它與 SharedPreferenceChangeListener 的不同之處為:
- SharedPreferenceChangeListener 在任何值保存到 SharedPreferences 文件后被觸發(fā)霎奢。
- PreferenceChangeListener 在值保存到 SharedPreferences 文件前被觸發(fā)。因此仲锄,可以防止對(duì)偏好設(shè)置做出無效的更新。PreferenceChangeListeners 也附加到了單個(gè)偏好設(shè)置上如失。
流程通常如下所示:
- 用戶更新偏好設(shè)置地啰。
- 該偏好設(shè)置觸發(fā)了 PreferenceChangeListener。
- 新的值保存到了 SharedPreference 文件栓袖。
- onSharedPreferenceChanged 監(jiān)聽器被觸發(fā)匣摘。
除此之外,它們的行為很相似裹刮。你將在你的 Activity中實(shí)現(xiàn)Preference.OnPreferenceChangeListener音榜,覆蓋onPreferenceChange(Preference preference, Object newValue)。 onPreferenceChange 方法將返回 true 或 false捧弃,取決于偏好設(shè)置實(shí)際上是否要被保存囊咏。
若要妥善管理 Activity 生命周期,我們建議您在 onResume() 和 onPause() 回調(diào)期間分別注冊(cè)和注銷SharedPreferences.OnSharedPreferenceChangeListener塔橡。
偏好設(shè)置的回調(diào)通用代碼:
// Override onSharedPreferenceChanged to update non CheckBoxPreferences when they are changed
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference preference = findPreference(key);
if (null != preference) {
if (!(preference instanceof CheckBoxPreference)) {
setPreferenceSummary(preference, sharedPreferences.getString(key, ""));
}
}
}
// Create a method called setPreferenceSummary that accepts a Preference and an Object and sets the summary of the preference
private void setPreferenceSummary(Preference preference, Object value) {
String stringValue = value.toString();
String key = preference.getKey();
if (preference instanceof ListPreference) {
/* For list preferences, look up the correct display value in */
/* the preference's 'entries' list (since they have separate labels/values). */
ListPreference listPreference = (ListPreference) preference;
int prefIndex = listPreference.findIndexOfValue(stringValue);
if (prefIndex >= 0) {
preference.setSummary(listPreference.getEntries()[prefIndex]);
}
} else {
// For other preferences, set the summary to the value's simple string representation.
preference.setSummary(stringValue);
}
}