2012-09-12 168 views
4

我仍在尋找一種方法來根據當前值更改ListPreference的摘要。經過一番研究,我設法得到它(部分)工作:更改首選項摘要

ListPreference pref = (ListPreference) findPreference("Repeat_PREFS"); 

    pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

     public boolean onPreferenceChange(Preference preference, Object val) { 

      ListPreference pref = (ListPreference) findPreference("Repeat_PREFS"); 

      pref.setSummary(pref.getEntry()); 
      return true; 
     } 

    }); 

的問題是,當我選擇了第一時間的值,彙總修改爲其他值或根本不會改變。當我第二次選擇相同的值時,摘要設置正確。我究竟做錯了什麼?

回答

5

沒有辦法爲首選項激活行爲。您需要使用要設置爲摘要的值調用setSummary(),例如使用偏好監聽器。

EDIT(變更的問題後...): 不要使用Preference.OnPreferenceChangeListener因爲新值持續(參見http://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener.html)因此,對於第一次更改自己的偏好值的行爲之前,它被調用。

我建議在您的PreferenceFragmentPreferenceActivity中實施OnSharedPreferenceChangeListener。 (不要忘記註冊和註銷監聽器。)在優先級更改完成後調用此監聽器。您還應該在XML中爲首選項設置默認值。

+0

非常感謝,我在我的PreferenceActivity中實現了Listener,現在它工作正常! \米/ – Droidman

1

到SharedPreferences OnSharedPreferenceChangeListener,對遺留代碼的替代方案(如果你不能更新所有的聽衆,或者不想混有偏好SharedPreferences):

使用Preference.OnPreferenceChangeListener但不使用preference.getEntry( ),這將返回舊值。相反,通過參數newValue獲取新值,在entryValues數組中獲取其索引,並通過entries數組中的索引獲取條目。

public OnPreferenceChangeListener prefListener = new OnPreferenceChangeListener() { 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     //Do not use lp.getEntry(), as it returns the old preference value before being changed 
     //Read entry corresponding to entryValue newValue. 
     ListPreference lPref = (ListPreference)preference; 
     String newEntry = (String) lPref.getEntries()[lPref.findIndexOfValue(newValue.toString())]; 
     //Compose your summary as you need 
     preference.setSummary(
      getResources().getString(
       R.string.myPref_summary, newEntry)); 
     return true; //Persist new value 
    } 
}; 

這當然不是性能友好的,但只要它不會運行很多次,它可能適合你。