在AndroidX偏好设置中为何出现String转Integer的类型转换异常?
ListPreference引发ClassCastException的原因分析
场景还原
preferences.xml中的ListPreference配置
<ListPreference app:dependency="@string/auto_record_key" app:defaultValue="3" app:dialogTitle="@string/track_step_distance_dialog_title" app:entries="@array/track_step_distance_entries" app:entryValues="@array/track_step_distance_values" app:key="@string/track_step_distance_key" app:summary="@string/track_step_distance_summary" app:title="@string/track_step_distance_title" />
对应的数组配置
<string-array name="track_step_distance_entries"> <item>off (time only)</item> <item>5</item> <item>10</item> <item>15</item> <item>20</item> <item>30</item> <item>50</item> <item>100</item> <item>200</item> <item>300</item> </string-array> <string-array name="track_step_distance_values"> <item>0</item> <item>5</item> <item>10</item> <item>15</item> <item>20</item> <item>30</item> <item>50</item> <item>100</item> <item>200</item> <item>300</item> </string-array>
触发异常的代码(onSharedPreferenceChanged方法内)
keyString = mContext.getString(R.string.track_step_distance_key ); if ( key == null || key.equals( keyString ) ) { int trackStepDistance = preferences.getInt( keyString, 3 ); }
抛出的异常信息
java.lang.RuntimeException: Unable to start activity ComponentInfo{dkr.ajijic.apps.tracks/dkr.ajijic.apps.tracks.MySettingsActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
异常原因
- ListPreference的存储特性:ListPreference继承自DialogPreference,无论
entryValues中的内容是数字还是文本,它都会将选中值以字符串类型存入SharedPreferences,不会自动转换为整数或其他类型。 - 读取方法类型不匹配:代码中调用
preferences.getInt()尝试读取实际为String类型的值,SharedPreferences会严格按照存储时的类型返回数据,不支持跨类型强制转换,因此直接触发ClassCastException。 - 默认值类型不一致:配置中
defaultValue="3"会被当作字符串存入SharedPreferences,而代码里getInt()的默认值是整数3,类型不匹配进一步加剧了读取时的冲突。
快速修复方案
改用getString()读取值后手动转换为整数:
keyString = mContext.getString(R.string.track_step_distance_key ); if (key == null || key.equals(keyString)) { String valueStr = preferences.getString(keyString, "3"); int trackStepDistance = Integer.parseInt(valueStr); }
内容的提问来源于stack exchange,提问作者BinCodinLong
相关产品推荐
相关产品推荐

