我有preferences.xml
,其中包含以下定义:
<ListPreference
android:title="@string/LimitSetting"
android:summary="@string/LimitSettingText"
android:key="limitSetting"
android:defaultValue="10"
android:entries="@array/limitArray"
android:entryValues="@array/limitValues" />
并且值定义如下:
<string-array name="limitArray">
<item>1 %</item>
<item>3 %</item>
<item>5 %</item>
<item>10 %</item>
<item>20 %</item>
</string-array>
<string-array name="limitValues">
<item>1</item>
<item>3</item>
<item>5</item>
<item>10</item>
<item>20</item>
</string-array>
在活动中被调用如下:
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
int offsetProgressInitial = sharedPref.getInt("limitSetting", 10);
到目前为止一直很好,但是当代码实际调用时我得到了这个错误:
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at android.app.SharedPreferencesImpl.getInt(SharedPreferencesImpl.java:239)
at com.test.app.NewEntryActivity.onCreate(NewEntryActivity.java:144)
at android.app.Activity.performCreate(Activity.java:5977)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)
这个错误对我没有任何意义。该列表仅包含可以转换为int的值,xml文件和代码中给出的默认值也只表示一个数字。那么为什么我会得到这个错误,以及如何解决它?
答案 0 :(得分:4)
如果你看一下getInt()
在内部的作用,你会看到问题:
Integer v = (Integer)mMap.get(key);
您的密钥“limitSetting”返回String
,无法转换为整数。
你可以自己解析它:
int offsetProgressInitial = Integer.parseInt(sharedPref.getString("limitSetting", "10"));
答案 1 :(得分:1)
首先让我们看一下SharedPreferences.getInt()方法。
public abstract int getInt(String key,int defValue)
<强>参数强>
返回:返回首选项值(如果存在)或defValue。 引发 ClassCastException 如果此名称的偏好不是int。
因此,在您的情况下,所有条目值都已定义为字符串数组。因此会抛出类强制转换异常。
您可以通过修改代码来解决此问题,如下所示。
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
int offsetProgressInitial = Integer.parseInt(sharedPref.getString("limitSetting", "10"));
答案 2 :(得分:0)
问题在于,如果从未调用过putInt
,那么即使您设置了默认的整数值,getInt
也会返回空值。
这似乎是一个从未修复的错误。因此解决方案是先调用putInt
,再调用getInt
。