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)不是您获得的内容的键吗?@Erik
getString(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;

    }