SharedPreferences.getInt() приводит к ClassCastException - Почему?
У меня есть простой (не изменяемый пользователем) численный параметр, определенный в XML-предпочтениях следующим образом:
<EditTextPreference
android:key="@string/numeric_val"
android:defaultValue="0" />
И я прочитал его, используя этот простой оператор:
sharedPrefs.getInt(getString(R.string.numeric_val), 3)
Это работает, но когда я пытаюсь прочитать его, в первый раз после установки приложения, он генерирует ClassCastException
.
В документации говорится, что getInt()
"Выбрасывает ClassCastException, если есть предпочтение с этим именем, которое не является int" . - и я знаю, что это предпочтение четко определено как <EditTextPreference>
(строка?), но если это причина исключения, то как я должен использовать SharedPreferences.getInt()
?
Я знаю, что я могу использовать SharedPreferences.getString()
вместо этого, а затем самостоятельно выполнить синтаксический анализ/преобразование, но тогда какова цель SharedPreferences.getInt()
?
Ответы
Ответ 1
Вы можете сохранить предпочтения как sharedPreferences.edit().putInt(..).commit()
(в качестве примера);
И затем получите их как getInt. Но если вы используете EditTextPreference, он установит тип предпочтения в строку. Поэтому, если вы используете EditTextPreference для хранения некоторых данных, используйте Integer.valueOf(getString)
, чтобы вернуть его.
Если вы положили его вручную, используйте getInt()
.
В качестве обходного решения вы можете установить onPreferenceChangeListener
в этом EditTextPreference, и всякий раз, когда пользователь меняет его, вы вручную сохраните его как int, так что getInt будет работать нормально.
Ответ 2
android:defaultValue="0"
- строка.
Невозможно объявить фактический int в xml ваших префов