更改偏好设置摘要

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

    });

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

2个回答

6

没有一种方法可以激活首选项的行为。您需要使用首选项监听器调用setSummary()并将要设置为摘要的值传递给它。

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

我建议在您的PreferenceFragmentPreferenceActivity中实现OnSharedPreferenceChangeListener。(不要忘记注册和注销侦听器。)此侦听器在完成首选项更改后被调用。您还应该在XML中为首选项设置默认值。


非常感谢,我在我的PreferenceActivity中实现了Listener,现在它可以正常工作了!\m/ - Droidman

1

对于旧代码而言,如果您无法更新所有监听器或不想将SharedPreferences与Preferences混合使用,则可以使用Preference.OnPreferenceChangeListener作为SharedPreferences OnSharedPreferenceChangeListener的替代方案:

但是请勿使用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
    }
};

这肯定不是性能友好型的,但只要它不会被频繁运行,那么它可能适合您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接