Я пытаюсь использовать 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";
Где я потерпел неудачу?




EditTextPreference возвращает значения String, например ListPreference. Вам необходимо преобразовать каждое значение, извлеченное из общих предпочтений из String в int. Например:
platformType = Integer.valueOf(sharedPref.getString
(SettingsActivity.KEY_PREF_PLATFORM_TYPE,"0"));
EditTextPreferences возвращает String, как ListPreferences. Каждое поле, которое вы пытаетесь извлечь, представляет собой строку. Я изменил ответ, чтобы быть более понятным.
Похоже, это решение ... спасибо
Попробуйте объявить свои значения int следующим образом
public static final int
KEY_PREF_LEFT_UDP_PORT = 1000;
ну нет ... KEY_PREF_LEFT_UDP_PORT и другие конечные переменные, определенные в SettingsActivity, являются просто напоминанием о значениях «ключа» в файле preferences.xml ...
Загрузка предпочтений из 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/…
да, я знаю, но, как вы можете прочитать в ответе xcesco, проблема с терминалом - это TextView, который будет выводить только объекты String
похоже, что все ключи, хранящиеся в общих настройках, являются строками, попробуйте загрузить их все как строки, а затем проанализируйте те, которые вам нужны, как целые числа. нравится :
String leftPort_string = sharedPref.getString
(SettingsActivity.KEY_PREF_LEFT_UDP_PORT,"4001");
leftPort=Integer.parseInt(leftPort_string);
У меня есть ошибки даже на leftPort ... не только на этом ... это не все исправляет (но приветствуется).