Android 获取ListPreference选择的键,而不是值-可能吗?
在Android 获取ListPreference选择的键,而不是值-可能吗?,android,android-preferences,Android,Android Preferences,在列表首选项中获取当前选定项的值非常简单: String selected = sharedPrefs.getString( getString(R.string.list_preference_array), "default string" ); 但是现在我需要获取当前所选项目的键。这可能吗 为了澄清,XML文件中的典型ListPreference定义包含以下组件: <ListPreference android:key="@string/list_pref
列表首选项中获取当前选定项的值非常简单:
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获得的当前选择。我错误地称它为“键”,但实际上它是一个“对应的标签”,它必须与实际内容不同。函数如下所示
因此,在您的示例代码中,getString(R.string.select\u string)
将返回键
添加SharedReference
时,需要指定键,以便该键与用于设置值的键相同
编辑:
使用带有ListPreference键的SharedReferences.getString()
,将返回用户从列表中选择的值。您不需要为ListPreference数组中的每个选项创建键,而且这些键不是自动创建的。与ListPreference的入口值相关的用例语句有点猜测:
int index = mylistpreference.findIndexOfValue(selected) // <- selected taken from your code above
String entry = mylistpreference.getEntries()[index];
int index=mylistpreference.findIndexOfValue(已选)/只需使用:
mylistpreference.getEntry()
要获取mylistpreference,请使用:
mylistpreference= (ListPreference) getPreferenceScreen().findPreference(key);
key是您在preference.xml中定义的android:key,位于标记中。@shai您的方法滞后于最后一个选择的条目
listPreference.getEntry()
相反,@Erik的方法工作得很好
int index = listPreference.findIndexOfValue((String) value)
String entry = listpreference.getEntries()[index];
正确更新列表首选项的摘要(使用标签而不是键)。
@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;
}
getString(R.string.select_string)不是您获得的内容的键吗?@ErikgetString(R.string.select_string)
是整个ListPreference数组的键(“名称”),而不是选择项。@uTubeFan,如果您使用的是ListPreference,则所选项目没有键,只有一个条目…@John Hmmm。。。android:entries=
的作用是什么?返回的字符串是来自android:entryValues=
的选择,但我需要获取所选条目(我可能因为没有更好的名称而错误地将其称为“key”)。android:entries
是当列表弹出时用户将看到的文本,而android:entryValues
是他们单击条目后将返回给您的值。代码中的任何内容都不需要android:entries
值。如果您确实需要它,那么您应该将条目
和条目值
设置为相同的内容。请参阅我对@Erik评论的回复。
@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;
}