设置可接受的范围
要将可接受的值限制在 0(不包括)和 3(包括)之间,我们选择使用
PreferenceChangeListener - 它与 SharedPreferenceChangeListener 的不同之处为:
- SharedPreferenceChangeListener 在任何值保存到 SharedPreferences 文件后被触发。
- PreferenceChangeListener 在值保存到 SharedPreferences 文件前被触发。因此,可以防止对偏好设置做出无效的更新。PreferenceChangeListeners 也附加到了单个偏好设置上。
流程通常如下所示:
- 用户更新偏好设置。
- 该偏好设置触发了 PreferenceChangeListener。
- 新的值保存到了 SharedPreference 文件。
- onSharedPreferenceChanged 监听器被触发。
除此之外,它们的行为很相似。你将在你的 Activity中实现Preference.OnPreferenceChangeListener,覆盖onPreferenceChange(Preference preference, Object newValue)。 onPreferenceChange 方法将返回 true 或 false,取决于偏好设置实际上是否要被保存。
若要妥善管理 Activity 生命周期,我们建议您在 onResume() 和 onPause() 回调期间分别注册和注销SharedPreferences.OnSharedPreferenceChangeListener。
偏好设置的回调通用代码:
// 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); } }