Какой класс предпочтений для целого числа? - PullRequest
3 голосов
/ 30 августа 2011

Чтобы сохранить целое число в настройках Android, я бы интуитивно пошел на EditTextPreference и сделал бы обычные преобразования String-int-String.

Но затем я наткнулся на фрагмент кода, который хранит целое числовместо <ListPreference>:

<ListPreference 
  android:key="@string/total_score"
  android:defaultValue="0" />

и извлекает его, используя preferences.getInt(getString(R.string.total_score), 0);

Это действительно работает?Если да, то как?

Считается ли это приемлемой практикой?

ОБНОВЛЕНИЕ: Благодаря ответам ниже я смог найти исходный код реализации для GetInt () .Я публикую его здесь для удобства:

jint android::content::SharedPreferences::getInt(local_ref< java::lang::String > const &a0, jint a1)
{
        return call_method<
                android::content::SharedPreferences::J2CPP_CLASS_NAME,
                android::content::SharedPreferences::J2CPP_METHOD_NAME(2),
                android::content::SharedPreferences::J2CPP_METHOD_SIGNATURE(2),
                jint
        >(get_jobject(), a0, a1);
}

Ответы [ 2 ]

9 голосов
/ 30 августа 2011

Теоретически, да, вы можете хранить целое число с ListPreference.В конце концов, это пользовательский интерфейс, который отображает отображаемую пользователем метку / ключ (android:entries) во внутреннее значение (android:entryValues) и отображает все эти параметры отображения в виде списка.Это внутреннее значение может быть целым числом.Вы можете использовать <integer-array> -ресурс для entryValues.

На практике я никогда не видел эту работу - она ​​ прослушивается .
Конечно, вы можете установить intзначение ключа предпочтения ListPreference в вашем коде, поскольку это нормальное внутреннее предпочтение.Но это лишило бы цели назначение предопределенных массивов ресурсов и возможность выбора из списка.В качестве обходного пути, если int-массив будет полезен, я рекомендую использовать <string-array> для значений и преобразовать их в целое число в коде, как вы это делали бы с вашей EditTextPreference

Check этот вопрос для нерабочего примера.;)

Чтобы ответить на ваш заглавный вопрос, какой из них выбрать для целого числа: Зависит.

Вы можете использовать любой из них в качестве обходного пути.

Если пользователь должен иметь возможность ввести любое значение (или просто много значений), EditTextPreference - это путь.ListPreference будет слишком длинным.

Если у вас небольшой набор предопределенных целых, используйте ListPreference.Это намного удобнее в использовании и может отображаться с полезными ярлыками.Пример: если пользователь должен выбрать временной интервал, вы можете отобразить секунды в значении и отобразить другую метку, например, час [значение 3600;ярлык «Час»].


Редактировать: Также есть идея, где может быть связан ваш фрагмент кода.Поскольку ListPreference не указывает ни android:entries, ни android:entryValues, он может быть просто частью файла настроек по умолчанию.Вы можете использовать PreferenceManager.setDefaultValues() с файлом XML для сброса / инициализации всех ваших ключей настроек.В этом случае вы выбираете абсолютно случайное предпочтение, потому что все поля, которые учитываются, равны android:key и android:defaultValue.Вы можете использовать любой другой тип в этом случае, не имеет значения.

1 голос
/ 30 августа 2011

Я думаю, что происходит, что ListPreference хранит значения записи в виде массива символов или, другими словами, массива байтов (это вывод из setEntryValues ​​(CharSequence [] entryValues) метод).Это может быть причиной сохранения числа, потому что значение сохраняется в байтовом массиве, поэтому использование метода preferences.getInt(...) все равно будет работать.Однако это может быть опасно, поскольку могут возникнуть расхождения с подписью, поэтому я бы не рекомендовал это делать, а вместо этого проанализировал бы int из предпочтения строки.

...