问题

我有一个Preference活动,它使用我的XML文件定义的List Preferences。如何将列表活动的摘要设置为所选的值?

谢谢!


#1 热门回答(368 赞)

最简单的方法就是让Android为你完成。假设你希望摘要与所选值匹配,你可以使用XML或Java中的setSummary方法简单地设置ListPreferenceto"%s"的摘要。例如:

<ListPreference
    android:key="pref_list"
    android:title="A list of preferences"
    android:summary="%s"
    android:entries="@array/pref_list_entries"
    android:entryValues="@array/pref_list_entries_values"
    android:defaultValue="0" />

Android将使用首选的当前字符串值替换%s,如3111484299的选择器所示。当你输入活动时,也会正确设置列表的摘要 - 你不必编写任何特殊代码来进行初始设置。

在我发现这个之前,我花了很多时间与SharedPreferenceslisteners混在一起。


#2 热门回答(28 赞)

你可以使用OnPreferenceChangeListener动态更改摘要。问题是它获得了选定的值(来自android:entryValues),而不是标题(android:entries)。在下面的代码中我使用了toString(),但正确的解决方案是找到值的标题。无论如何,这个想法是有效的:

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.your_prefs);

        ListPreference listPreference = (ListPreference) findPreference("preference_key");
        if(listPreference.getValue()==null) {
            // to ensure we don't get a null value
            // set first value by default
            listPreference.setValueIndex(0);
        }
        listPreference.setSummary(listPreference.getValue().toString());
        listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                preference.setSummary(newValue.toString());
                return true;
            }
        });
    }
}

#3 热门回答(17 赞)

我也想实现类似的东西,但问题是https://stackoverflow.com/a/8155029/592025,它显示了我偏好的值(如1,2 3等)。我想显示与所选值对应的条目(人类可读字符串)。

所以我用这种方式改变它并以我需要的方式工作。

listPreference.setSummary(servicePreference.getEntry().toString());
listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // Set the value as the new value
            listPreference.setValue(newValue.toString());
            // Get the entry which corresponds to the current value and set as summary
            preference.setSummary(listPreference.getEntry());
            return false;
        }
    });

诀窍是使用2773174277而不是getValue(),一旦值改变,显式设置值并读回条目。


原文链接