我收到一个非常奇怪的错误。
我有2个活动。我在SharedPreferences
上使用MODE_PRIVATE
sp = getPreferences(MODE_PRIVATE);
onCreate()
sp.getBoolean(IntroActivity.SHOW_INTRO, true)
IntroActivity
每个活动10-12 04:55:23.208: E/AndroidRuntime(11668): FATAL EXCEPTION: main
10-12 04:55:23.208: E/AndroidRuntime(11668): java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
10-12 04:55:23.208: E/AndroidRuntime(11668): at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:242)
10-12 04:55:23.208: E/AndroidRuntime(11668): at com.lablabla.parkme.ParkMeActivity$2.onClick(ParkMeActivity.java:194)
10-12 04:55:23.208: E/AndroidRuntime(11668): at android.view.View.performClick(View.java:4084)
10-12 04:55:23.208: E/AndroidRuntime(11668): at android.view.View$PerformClick.run(View.java:16966)
10-12 04:55:23.208: E/AndroidRuntime(11668): at android.os.Handler.handleCallback(Handler.java:615)
10-12 04:55:23.208: E/AndroidRuntime(11668): at android.os.Handler.dispatchMessage(Handler.java:92)
10-12 04:55:23.208: E/AndroidRuntime(11668): at android.os.Looper.loop(Looper.java:137)
10-12 04:55:23.208: E/AndroidRuntime(11668): at android.app.ActivityThread.main(ActivityThread.java:4745)
10-12 04:55:23.208: E/AndroidRuntime(11668): at java.lang.reflect.Method.invokeNative(Native Method)
10-12 04:55:23.208: E/AndroidRuntime(11668): at java.lang.reflect.Method.invoke(Method.java:511)
10-12 04:55:23.208: E/AndroidRuntime(11668): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-12 04:55:23.208: E/AndroidRuntime(11668): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-12 04:55:23.208: E/AndroidRuntime(11668): at dalvik.system.NativeStart.main(Native Method)
String
我正在打电话给//onCreate()
sp = getPreferences(MODE_PRIVATE);
// other method
boolean showIntro = sp.getBoolean(IntroActivity.SHOW_INTRO, true); // Exception is here
showIntroCheckBox.setChecked(showIntro);
在onClick
上这很好用。但是当我在主要活动中尝试时,我得到了这个
{{1}}
我确定我没有在同一个键的中间位置放置{{1}}
有什么想法吗?
谢谢!
编辑: 一些代码:
{{1}}
如果重要,抛出异常的代码位于按钮的{{1}}
内答案 0 :(得分:47)
如果有一个带有该密钥的字符串,即使是偶然的,它也会一直存在,直到您清除应用程序的数据或卸载为止。尝试卸载它以查看它是否仍然存在。
答案 1 :(得分:4)
此Android方法发生异常:
public boolean getBoolean(String key, boolean defValue) {
synchronized (this) {
awaitLoadedLocked();
Boolean v = (Boolean)mMap.get(key); // On this line
return v != null ? v : defValue;
}
}
我唯一可以理解的错误是你在代码中的其他地方重用了密钥IntroActivity.SHOW_INTRO
。
答案 2 :(得分:2)
我假设
sp.getBoolean(IntroActivity.SHOW_INTRO, true)// this line returns a String value.
所以你可以这样做
boolean showIntro = Boolean.parseBoolean(sp.getBoolean(IntroActivity.SHOW_INTRO, true));
答案 3 :(得分:2)
使用以下代码在SharedPreference
中设置布尔值:
SharedPreferences appSharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this.getApplicationContext());
Editor prefsEditor = appSharedPrefs.edit();
prefsEditor.putBoolean(IntroActivity.SHOW_INTRO, true);
prefsEditor.commit();
要从SharedPreference
检索布尔值,请使用以下代码:
SharedPreferences appSharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this.getApplicationContext());
boolean showIntro = appSharedPrefs.getBoolean(IntroActivity.SHOW_INTRO, true);
答案 4 :(得分:1)
这条线 sp.getBoolean(IntroActivity.SHOW_INTRO,true)//该行返回一个String值。
所以你必须按照下面给出的那样做,
String flag=sp.getBoolean(IntroActivity.SHOW_INTRO, true);
if(flag.equalsIgnoreCase("true")){
boolean showIntro = true;
}else{
boolean showIntro = false;
}
试试这个肯定会有效。
答案 5 :(得分:1)
这是每个人用钥匙做的常见错误, 我猜IntroActivity.SHOW_INTRO =“xyz_key”如果,你使用相同的“xyz_key”换另一个常量会出现这个错误,所以key的值应该是唯一的..快乐编码:)
答案 6 :(得分:0)
错误地,我在XML文件android:key="your_key"
中为相同 键提供了两个首选项时出现此异常!
因此,仔细检查您的settings.xml可能有所帮助。