更改偏好'摘要

时间:2012-09-12 10:43:27

标签: android preferences preferenceactivity summary

我仍在寻找一种方法来根据其当前值更改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;
        }

    });

问题在于,当我第一次选择值时,摘要会更改为其他值或根本不会更改。当我第二次选择相同的值时,会正确设置摘要。我究竟做错了什么?

2 个答案:

答案 0 :(得分:6)

没有方法可以激活首选项的行为。您需要使用要设置为摘要的值调用setSummary(),例如使用偏好监听器。

编辑(更改问题后......): 不要使用Preference.OnPreferenceChangeListener,因为在新值保持之前调用它(参见http://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener.html)因此首次更改为您的首选项值的行为。

我建议您在OnSharedPreferenceChangeListenerPreferenceFragment中实施PreferenceActivity。 (不要忘记注册和取消注册侦听器。)在完成对首选项的更改后调用此侦听器。您还应该在XML中为首选项设置默认值。

答案 1 :(得分:1)

SharedPreferences OnSharedPreferenceChangeListener的替代方案,用于遗留代码(如果您无法更新所有侦听器,或者不想将SharedPreferences与Preferences混合使用):

使用Preference.OnPreferenceChangeListener但不要使用preference.getEntry(),它将返回旧值。相反,通过参数newValue获取其新值,在entryValues数组中获取其索引,并在条目数组中通过索引获取条目。

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
    }
};

这当然不是对性能友好,但只要它不会多次运行它就可以满足你的要求。