當用戶在Android應用上編輯preferences時,我想要讓他們在Preference列表可以看到preference當前設置的值
例如:如果我有一個Preference設置成“刪除舊信息”,當這個消息被閱讀後,指定在多少天後刪除消息。在PreferenceActivity中,我比較想要用戶看到這樣:
“刪除舊信息” <- 標題
“x天後刪除信息”<-列表中x就是Preference當前的值
這個可以重復使用,這個我就能夠簡單的把它應用到我所有的preferences中了,而不用管他們的類型(以便它使用最少數量的EditTextPreference,ListPreference等仍然可以工作)
很不幸,這看起來並不簡單,這樣做的自動方法(你應該也注意到了,幾乎沒有本地的preferences這樣做)。那就是說,我確定這是一個相當普通的需求,所以這是我達到這個目的的方法。
關鍵是要讓你的PreferenceActivity類實現OnSharedPreferenceChangeListener方法。使用onSharedPreferenceChanged方法你可以監聽到具體的preference關鍵字,然後在相關的preference上使用setSummary來控制修改文本,像這樣:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(KEY_A_CHECKBOX_PREFERENCE)) {
mCheckBoxPreference.setSummary(sharedPreferences.getBoolean(key, false) ? "Disable this setting" : "Enable this setting");
}
else if (key.equals(KEY_AN_EDITTEXT_PREFERENCE)) {
mEditBoxPreference.setSummary("Current value is " + sharedPreferences.getString(key, ""));
}
}
在應用程序共享參數上允許這個類作為一個監聽者來對preference的改變進行監聽使用registerOnSharedPreferenceChangeListener 方法 ,像這樣:
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
你的最好的方法就是在onResume上進行登記然後再在onPause中撤銷。當你登記這個監聽者來確保你獲得了正確的初始值得時候,你可能也需要更新文件的值
下邊的例子是android示例
public class AdvancedPreferences extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
public static final String KEY_LIST_PREFERENCE= "list_preference";
public static final String KEY_CHECKBOX_PREFERENCE= "checkbox_preference";
private CheckBoxPreference mCheckBoxPreference;
private ListPreference mListPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.advanced_preferences);
mCheckBoxPreference= (CheckBoxPreference)getPreferenceScreen().findPreference(KEY_ADVANCED_CHECKBOX_PREFERENCE);
mListPreference= (ListPreference)getPreferenceScreen().findPreference(KEY_LIST_PREFERENCE);
}
@Override
protected void onResume() {
super.onResume();
mCheckBoxPreference.setSummary(sharedPreferences.getBoolean(key, false) ? "Disable this setting" : "Enable this setting");
mListPreference.setSummary("Current value is " + sharedPreferences.getValue(key, ""));
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(KEY_CHECKBOX_PREFERENCE)) {
mCheckBoxPreference.setSummary(sharedPreferences.getBoolean(key, false) ? "Disable this setting" : "Enable this setting");
}
else if (key.equals(KEY_LIST_PREFERENCE)) {
mListPreference.setSummary("Current value is " + sharedPreferences.getValue(key, ""));
}
}
}