获取ListPreference选择的Key,而不是值 - 可能吗?

时间:2011-08-31 17:46:51

标签: android android-preferences

获取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 中选择的内容。我错误地称它为“关键”但实际上它是一个“相应的标签”,它必须与实际内容不同。

5 个答案:

答案 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;

    }