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

    });

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

4

2 回答 2

6

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

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

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

于 2012-09-12T10:56:01.497 回答
1

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

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

这当然对性能不友好,但只要它不会运行很多次,它就可以适合您。

于 2013-05-16T18:04:02.343 回答