Исключение Android SharedPreferences в getInt - PullRequest
0 голосов
/ 03 октября 2018

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

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>

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

public static final String
        KEY_PREF_CHECK_SSID = "checkSSID";

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

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

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

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

leftPort=Integer.parseInt(leftPort_string);
0 голосов
/ 03 октября 2018

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

public static final int
        KEY_PREF_LEFT_UDP_PORT = 1000;
0 голосов
/ 03 октября 2018

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

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

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

0 голосов
/ 03 октября 2018

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

platformType  = Integer.valueOf(sharedPref.getString
        (SettingsActivity.KEY_PREF_PLATFORM_TYPE,"0"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...