Как получить Android ListPreference, определенный в Xml, значения которого являются целыми числами?

Можно ли определить ListPreference в Xml и получить значение из SharedPreferences с помощью getInt? Вот мой Xml:

<ListPreference android:key="@string/prefGestureAccuracyKey"
    android:title="@string/prefGestureAccuracyTitle" android:summary="@string/prefGestureAccuracyDesc"
    android:entries="@array/prefNumberAccuracyLabels" android:entryValues="@array/prefNumberAccuracyValues"
    android:dialogTitle="@string/prefGestureAccuracyDialog"
    android:persistent="true" android:defaultValue="2"
    android:shouldDisableView="false" />

И я хочу получить значение примерно так: int val = sharedPrefs.getInt(key, defaultValue).

На данный момент мне нужно использовать getString и проанализировать результат.


person Rob Kent    schedule 24.04.2010    source источник
comment
Это должно работать в соответствии с руководством developer.android.com/intl. /de/reference/android/content/   -  person Pentium10    schedule 24.04.2010
comment
Я не понимаю вашего вопроса. Какое значение вы готовы получить?   -  person Macarse    schedule 25.04.2010
comment
Хорошо, что Xml создает предпочтение типа String, а не Integer. Я хотел бы Preference, значение которого строго типизировано как int. Этот вопрос возник из предыдущего, который я написал, который объясняет контекст: stackoverflow.com/questions/2705091/   -  person Rob Kent    schedule 25.04.2010


Ответы (5)


Насколько я понимаю, ListPreference может работать только со строковыми массивами. Вам придется использовать getString() и самостоятельно преобразовать в целое число. См. http://code.google.com/p/android/issues/detail?id=2096 для отчета об ошибке. Не похоже, что Google планирует расширять ListPreference для обработки чего-либо, кроме строк.

Также: вам также нужно будет сохранить предпочтение в виде строки. В противном случае ваша активность в настройках завершится сбоем при запуске и попытке прочитать строковое значение.

person Edward Falk    schedule 13.06.2010
comment
Спасибо. Я не сталкивался с этим отчетом об ошибке. - person Rob Kent; 13.06.2010

Я сделал это немного более экстремальным способом.

Я использовал ListPreference и сделал свой массив entryValues ​​содержащим строки, которые я могу преобразовать в целое число с помощью Integer.parseInt().

Затем в моей PreferencesActivity я устанавливаю OnPreferenceChangeListener для этого предпочтения, а в методе onPreferenceChange() я устанавливаю другое предпочтение целочисленной версии — это второе значение, которое я фактически использую в своем коде. Первый существует только для пользовательского варианта.

Таким образом, мне не нужно преобразовывать String в int каждый раз, когда мне нужно посмотреть на него, я просто делаю это, когда пользователь устанавливает его. Возможно перебор, но работает :)

person Michael    schedule 28.09.2011

На самом деле, как вы можете прочитать в документах:

http://developer.android.com/reference/android/preference/ListPreference.html#getValue()

Метод получения значения ListPreference:

public String getValue ()

Таким образом, вы получаете строку. Это не имеет большого значения, но было бы лучше допустить целые числа.

person viridis    schedule 16.05.2012

Вам нужно создать ресурс xml и установить для него значение по умолчанию. Все, что вы вводите в XML-файл как литерал, обрабатывается как строка, поэтому ListPreference выдает исключение нулевого указателя при попытке найти строку в массиве целых чисел.

person Dewey    schedule 04.05.2012

Но для меня вы сначала получаете строковый тип: String numStr = prefs.getString("key", "-555"); затем: `

try {
    int yourInt =  Integer.parseInt(numStr);
    if(yourInt != -555)
    {
        //do your stuff
    }
}
catch(Exception e)
{
    ...
}

`

person Ahmad Tukur    schedule 11.08.2016