获取ListPreference
中当前所选项目的值非常简单:
String selected = sharedPrefs.getString(
getString(R.string.list_preference_array),
"default string"
);
但现在我需要获取当前所选项目的键。这可能吗?
为了澄清,XML文件中的典型ListPreference定义包含以下组件:
<ListPreference
android:key="@string/list_preference_array"
android:title="Title of ENTIRE list (not seen by user?)"
android:summary="this is what the user sees in small fonts"
android:defaultValue="just in case"
android:entries="@array/user_friendly_labels"
android:entryValues="@array/code_meaningful_strings"
android:dialogTitle="User Prompt(big font)"
android:showDefault="true"
android:showSilent="true"
/>
sharedPrefs.getString()
返回的是 android:entryValues 中的当前选择。我感兴趣的是当前从 android:entries 中选择的内容。我错误地称它为“关键”但实际上它是一个“相应的标签”,它必须与实际内容不同。
答案 0 :(得分:14)
有点猜测:
int index = mylistpreference.findIndexOfValue(selected) // <- selected taken from your code above
String entry = mylistpreference.getEntries()[index];
答案 1 :(得分:1)
只需使用:
mylistpreference.getEntry()
使用mylistpreference:
mylistpreference= (ListPreference) getPreferenceScreen().findPreference(key);
key是你在preference.xml里面定义的android:key&lt; ListPreference&GT;标签
答案 2 :(得分:0)
该功能为defined
SharedPreferences.getString(String key, String defaultValue);
因此,在您的示例代码中,getString(R.string.select_string)
将返回密钥。
当您添加SharedPreference
时,您需要指定密钥,因此密钥与您用于设置值的密钥相同。
修改强>
使用带有ListPreference键的SharedPreferences.getString()
作为键将返回用户从列表中选择的值。您不需要为ListPreference数组中的每个选项创建键,也不会自动创建这些键。与ListPreference的entryValues
。
答案 3 :(得分:0)
@shai您的方法滞后于上次选择的条目
min-width: 0; word-wrap: break-word;
相反,@ Erik的方法效果很好
listPreference.getEntry()
答案 4 :(得分:0)
要正确更新ListPreference的摘要(使用标签而不是密钥)。
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();
if (preference instanceof ListPreference) {
ListPreference listPreference = (ListPreference) preference;
int prefIndex = listPreference.findIndexOfValue(stringValue);
if (prefIndex >= 0) {
CharSequence[] labels = listPreference.getEntries();
preference.setSummary(labels[prefIndex]);
}
} else {
preference.setSummary(stringValue);
}
return true;
}