SharedPreferences.getInt () приводит к ClassCastException - Почему? - PullRequest
19 голосов
/ 31 августа 2011

У меня есть простая (не редактируемая пользователем) числовая настройка, определенная в XML-настройке следующим образом:

<EditTextPreference
  android:key="@string/numeric_val"
  android:defaultValue="0" />

И я прочитал ее, используя простое утверждение:

sharedPrefs.getInt(getString(R.string.numeric_val), 3)

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

В документации говорится, что getInt() "Выдает исключение ClassCastException, если есть предпочтение с этим именем, которое не является целым числом." - и я знаю, что это предпочтение четко определено как <EditTextPreference> (строка?), Но, если этопричина исключения: как я должен использовать SharedPreferences.getInt()?

Я знаю, что вместо этого могу использовать SharedPreferences.getString(), а затем сам выполнять разбор / преобразование, но тогда какова цель SharedPreferences.getInt()

Ответы [ 2 ]

29 голосов
/ 31 августа 2011

Вы можете сохранить настройки как sharedPreferences.edit().putInt(..).commit() (как пример);

А затем получите их как getInt. Но если вы используете EditTextPreference, он установит тип предпочтения на строку. Поэтому, если вы используете EditTextPreference для хранения некоторых данных, используйте Integer.valueOf(getString), чтобы получить их обратно.

Если вы поставите вручную , используйте getInt().

В качестве обходного пути вы можете установить onPreferenceChangeListener для этого EditTextPreference, и всякий раз, когда пользователь изменяет его, вы вручную сохраняете его как int, поэтому getInt будет работать нормально.

6 голосов
/ 31 августа 2011
android:defaultValue="0"

- это строка.

Невозможно объявить фактическое значение int в xml ваших настроек

...