安卓列表首选项:将摘要作为所选值?

2022-08-31 08:55:17

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


答案 1

最简单的方法是让Android为您完成。假设您希望摘要与所选值匹配,则只需使用 XML 或 Java 中的方法ListPreference 的摘要设置为“%s”。例如:setSummary

<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 将替换为首选项的当前字符串值,如 的选择器所示。当您输入活动时,列表的摘要也将正确设置 - 您无需编写任何特殊代码即可在最初设置它。%sListPreference

这也适用于 AndroidX 。ListPreference

在我发现这一点之前我花了太多时间与听众混在一起。SharedPreferences


答案 2

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

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

推荐