我正在开发Android应用程序,无法弄清楚我正在制作的错误或错误。我正在搜索错误超过4个小时,所以请不要想,我在困扰你调试懒惰。
我使用SharedPreferences获得以下异常:
E/AndroidRuntime: FATAL EXCEPTION: main
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:235)
at de.immozukunft.quicksteuer.QuickSteuerActivity.updateTextView(QuickSteuerActivity.java:56)
at de.immozukunft.quicksteuer.QuickSteuerActivity.onCreate(QuickSteuerActivity.java:36)
但根据我的理解,我并没有在那条线上做演员。第36行是方法 updateTextView()。
的调用private void updateTextView() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
int legalForm = Integer.parseInt(prefs.getString("legal_form", "1"));
boolean industrialTax = prefs.getBoolean("industrial_tax", false);
boolean turnoverTax = prefs.getBoolean("turnover_tax", false);
boolean disbursal = prefs.getBoolean("disbursal", false);
String tmp = prefs.getString("capitalownership", "0"); //this is line 56
int capitalOwnership = Integer.parseInt(tmp);
int estIncome = Integer.parseInt(prefs.getString("est_income", "0"));
}
我在XML文件中的偏好如下:
<EditTextPreference
android:defaultValue="0"
android:dialogTitle="@string/capitalownership"
android:inputType="number"
android:key="capitalownership"
android:title="@string/capitalownership" />
我需要我会发布完整的代码和完整的错误列表。
我对Android比较陌生,所以请原谅我,如果这是一个愚蠢的问题......
亲切的问候
THE-E
修改 解决方案:
private void updateTextView() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String legalForm = prefs.getString("legal_form", "1");
boolean industrialTax = prefs.getBoolean("industrial_tax", false);
boolean turnoverTax = prefs.getBoolean("turnover_tax", false);
boolean disbursal = prefs.getBoolean("disbursal", false);
String capitalOwnership = prefs.getString("capitalownership", "0");
String estIncome = prefs.getString("est_income", "1");
settingstv.setText(getString(R.string.overview_settings,
legalForm,
Boolean.toString(industrialTax),
Boolean.toString(turnoverTax),
Boolean.toString(disbursal),
capitalOwnership,
estIncome));
try {
if (!compareCurrentWithStoredVersionCode(this, prefs, "storedVersionCode")) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("legal_form", legalForm);
editor.putBoolean("industrial_tax", industrialTax);
editor.putBoolean("turnover_tax", turnoverTax);
editor.putBoolean("disbursal", disbursal);
editor.putString("capitalownership", capitalOwnership);
editor.putString("est_income", estIncome);
editor.commit();
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "updateTextView()", e);
}
}
答案 0 :(得分:3)
你第一次保存capitalownership
时可能没有将它保存为String,所以当你尝试检索它时,它会检索一个Integer,但是当你这样做时你会尝试转换为String {1}}它将获得异常。
getString
尝试这样:
String tmp = prefs.getString("capitalownership", "0");
此外,您已经将编辑文本设置为仅输入数字,因此您不会在此处获得字符串。
修改强>
共享偏好设置存储为int tmp = prefs.getInt("capitalownership", 0);
。正如您所看到的,地图的值是一般Map<String, Object>
,如果您保存为Object
,则需要检索整数。这是非常动态的,所以如果你保存一次作为Integer
而下一次保存为integer
(对于同一把钥匙),你需要跟踪你保存的类型,这样你就可以检索它。
如果您已将String
保存一次,稍后再次保存(使用同一密钥)Integer
,则在检索时,您需要使用String
。如果您不确定其中的内容,可以使用getAll()方法将整个首选项检索为getString()
,然后您可以在此地图中使用Map<String, Object>
,最后使用{{1}进行检查看看它是什么类型。但这太麻烦了,你只需要确定你会用某种类型保存那个密钥(资本所有权),并确保你总是这样做。
所以这就是发生的事情:
1)您尝试检索与该键关联的值,Android会为您提供一个对象
2)Android然后尝试转换为与方法关联的值(在您的情况下为String)。因为该值实际上是一个Integer,它就是类转换问题的来源。
答案 1 :(得分:2)
返回首选项值(如果存在)或defValue。抛出 如果存在不具有此名称的首选项,则为ClassCastException 一个字符串。
所以我猜你有一个“资本所有权”偏好,已存储为整数
答案 2 :(得分:0)
你不应该使用
int capitalOwnership = Integer.parseInt(tmp);
因为您试图将整数作为字符串
<EditTextPreference
android:defaultValue="0"
android:dialogTitle="@string/capitalownership"
**android:inputType="number"**
android:key="capitalownership"
android:title="@string/capitalownership" />
改为使用此
int capitalOwnership = pref.getInt("capitalownership", 0);
你也需要像这样保存它
pref.putInt("key",value);