Исключение Android SharedPreferences в getInt

Я пытаюсь использовать SharedPreferences и наткнулся на, вероятно, глупую ошибку. Это мой код (класс Основная деятельность):

private Boolean checkSSID;
private String connectionSSID;
private int leftPort;
private int rightPort;
private int LLUPort;
private int localUDPPort;
private String platformIPAddrStr;

Внизу метода onCreate ():

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

SharedPreferences sharedPref =
        PreferenceManager.getDefaultSharedPreferences(this);

checkSSID = sharedPref.getBoolean
        (SettingsActivity.KEY_PREF_CHECK_SSID, false);

connectionSSID = sharedPref.getString
        (SettingsActivity.KEY_PREF_CONNECTION_SSID, "\"bulldog\"");

leftPort = sharedPref.getInt
        (SettingsActivity.KEY_PREF_LEFT_UDP_PORT, 4001);

rightPort = sharedPref.getInt
        (SettingsActivity.KEY_PREF_RIGHT_UDP_PORT, 4002);

LLUPort = sharedPref.getInt
        (SettingsActivity.KEY_PREF_LLU_UDP_PORT, 8888);

localUDPPort = sharedPref.getInt
        (SettingsActivity.KEY_PREF_LOCAL_UDP_PORT, 5555);

platformType = sharedPref.getInt
        (SettingsActivity.KEY_PREF_PLATFORM_TYPE,0);

при первом вызове getInt () приложение вылетает с этой ошибкой:

java.lang.RuntimeException: Unable to start activity ComponentInfo{it.xxx/it.xxx.MainActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

Макет PreferenceScreen:

<PreferenceScreen xmlns:tools = "http://schemas.android.com/tools"
    xmlns:android = "http://schemas.android.com/apk/res/android">

    <android.support.v7.preference.SwitchPreferenceCompat
        android:defaultValue = "true"
        android:key = "checkSSID"
        android:summary = "@string/checkSSID_summary"
        android:title = "@string/checkSSID_title" />
    <EditTextPreference
        android:defaultValue = "bulldog"
        android:key = "connectionSSID"
        android:selectAllOnFocus = "true"
        android:singleLine = "true"
        android:summary = "@string/LLUUDPPort_summary"
        android:title = "@string/LLUUDPPort_title" />
    <EditTextPreference
        android:defaultValue = "192.168.1.40"
        android:key = "platformIPAddr"
        android:selectAllOnFocus = "true"
        android:singleLine = "true"
        android:summary = "@string/PlatformIPAddr_summary"
        android:title = "@string/PlatformIPAddr_title" />
    <ListPreference
        android:defaultValue = "1"
        android:entries = "@array/PlatformType_titles"
        android:entryValues = "@array/PlatformType_values"
        android:key = "platformType"
        android:summary = "@string/PlatformType_summary"
        android:title = "@string/PlatformType_title" />
    <EditTextPreference
        android:defaultValue = "4001"
        android:key = "leftBankUDPPort"
        android:selectAllOnFocus = "true"
        android:singleLine = "true"
        android:summary = "@string/LeftBankUDPPort_summary"
        android:title = "@string/LeftBankUDPPort_title" />
    <EditTextPreference
        android:defaultValue = "4002"
        android:key = "rightBankUDPPort"
        android:selectAllOnFocus = "true"
        android:singleLine = "true"
        android:summary = "@string/RightBankUDPPort_summary"
        android:title = "@string/RightBankUDPPort_title" />
    <EditTextPreference
        android:defaultValue = "8888"
        android:key = "LLUUDPPort"
        android:selectAllOnFocus = "true"
        android:singleLine = "true"
        android:summary = "@string/LLUUDPPort_summary"
        android:title = "@string/LLUUDPPort_title" />
    <EditTextPreference
        android:defaultValue = "5555"
        android:key = "localUDPPort"
        android:selectAllOnFocus = "true"
        android:singleLine = "true"
        android:summary = "@string/localUDPPort_summary"
        android:title = "@string/localUDPPort_title" />
</PreferenceScreen>

В Настройки я объявил все общедоступные строки, используемые для вызова ключа предпочтений ... то есть:

public static final String
        KEY_PREF_CHECK_SSID = "checkSSID";

Где я потерпел неудачу?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
75
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

EditTextPreference возвращает значения String, например ListPreference. Вам необходимо преобразовать каждое значение, извлеченное из общих предпочтений из String в int. Например:

platformType  = Integer.valueOf(sharedPref.getString
        (SettingsActivity.KEY_PREF_PLATFORM_TYPE,"0"));

У меня есть ошибки даже на leftPort ... не только на этом ... это не все исправляет (но приветствуется).

weirdgyn 03.10.2018 18:37

EditTextPreferences возвращает String, как ListPreferences. Каждое поле, которое вы пытаетесь извлечь, представляет собой строку. Я изменил ответ, чтобы быть более понятным.

xcesco 03.10.2018 18:41

Похоже, это решение ... спасибо

weirdgyn 03.10.2018 21:29

Попробуйте объявить свои значения int следующим образом

public static final int
        KEY_PREF_LEFT_UDP_PORT = 1000;

ну нет ... KEY_PREF_LEFT_UDP_PORT и другие конечные переменные, определенные в SettingsActivity, являются просто напоминанием о значениях «ключа» в файле preferences.xml ...

weirdgyn 03.10.2018 21:17

Загрузка предпочтений из XML-ресурсов может иметь дело только со строками (насколько мне известно). В вашем сценарии это @string:

<android.support.v7.preference.SwitchPreferenceCompat
    android:defaultValue = "true"
    android:key = "checkSSID"
    android:summary = "@string/checkSSID_summary"
    android:title = "@string/checkSSID_title" />

Следовательно, я не знаю варианта использования других методов, таких как getInt, но я также загрузил его как строку, а затем проанализировал / преобразовал ее в требуемый тип, например, description by @xcesco.

да ладно, моя плохая. Вы пытались поместить int в отдельный целочисленный ресурс xml, как описано здесь? stackoverflow.com/questions/19297522/…

TeddybearCrisis 03.10.2018 22:24

да, я знаю, но, как вы можете прочитать в ответе xcesco, проблема с терминалом - это TextView, который будет выводить только объекты String

weirdgyn 04.10.2018 08:11

похоже, что все ключи, хранящиеся в общих настройках, являются строками, попробуйте загрузить их все как строки, а затем проанализируйте те, которые вам нужны, как целые числа. нравится :

String leftPort_string = sharedPref.getString
    (SettingsActivity.KEY_PREF_LEFT_UDP_PORT,"4001");

leftPort=Integer.parseInt(leftPort_string);

Другие вопросы по теме