Получить ключ, а не значение из списка ListPreference - возможно? - PullRequest
4 голосов
/ 31 августа 2011

Получить значение выбранного в данный момент элемента в ListPreference просто:

String selected = sharedPrefs.getString(
    getString(R.string.list_preference_array),
    "default string"
);

Но теперь мне нужно вместо этого получить клавишу выбранного в данный момент предмета. Возможно ли это?

Для пояснения, типичное определение ListPreference в файле XML содержит следующие компоненты:

<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: записи . Я по ошибке назвал его «ключом», но на самом деле это «соответствующий ярлык», который должен отличаться от реального содержимого.

Ответы [ 5 ]

14 голосов
/ 01 сентября 2011

Немного предположение:

int index = mylistpreference.findIndexOfValue(selected)  // <- selected taken from your code above
String entry = mylistpreference.getEntries()[index];
1 голос
/ 30 марта 2012

просто используйте:

mylistpreference.getEntry()

, чтобы получить mylistpreference, используйте:

mylistpreference= (ListPreference) getPreferenceScreen().findPreference(key);

ключ - это android: ключ, который вы определили в preference.xml внутри тега .

0 голосов
/ 31 мая 2018

Для правильного обновления сводки 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;

    }
0 голосов
/ 03 ноября 2015

@ shai Ваш метод отстает от последней выбранной записи

listPreference.getEntry()

Скорее, метод @Erik работает хорошо

int index = listPreference.findIndexOfValue((String) value)
String entry = listpreference.getEntries()[index];
0 голосов
/ 31 августа 2011

Функция определена как

SharedPreferences.getString(String key, String defaultValue);

Итак, в вашем примере кода getString(R.string.select_string) вернет ключ.

Когда вы добавляете SharedPreference, вам нужно указать ключ, поэтому ключ будет тем же, который вы использовали для установки значения.

Изменить:

с использованием SharedPreferences.getString() с ключом ListPreference в качестве ключа вернет значение, выбранное пользователем из списка. Вам не нужно создавать ключи для каждой опции в массиве ListPreference, и эти ключи не создаются автоматически. Используйте операторы case, которые соответствуют ListPreference entryValues.

...