15

我收到一个非常奇怪的错误。我有 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

4

7 回答 7

48

如果该键曾经有一个字符串,即使是偶然的,它也会保留在那里,直到您清除应用程序的数据或卸载。尝试卸载它,看看它是否仍然存在。

于 2012-10-12T03:23:46.833 回答
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代码中的其他地方重用字符串的密钥。

于 2012-10-12T03:24:39.890 回答
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);
于 2012-10-12T03:31:41.573 回答
2

我假设

sp.getBoolean(IntroActivity.SHOW_INTRO, true)// this line returns a String value.

所以你可以这样做

boolean showIntro = Boolean.parseBoolean(sp.getBoolean(IntroActivity.SHOW_INTRO, true));
于 2012-10-12T03:22:17.117 回答
1

sp.getBoolean(IntroActivity.SHOW_INTRO, true)// 这一行返回一个字符串值。

所以你必须按照下面给出的做,

String flag=sp.getBoolean(IntroActivity.SHOW_INTRO, true);

if(flag.equalsIgnoreCase("true")){
    boolean showIntro = true;   
}else{
    boolean showIntro = false;
}

试试这个,它肯定会奏效。

于 2012-10-12T03:33:24.073 回答
1

这是每个人都会用 key 犯的常见错误,我猜 IntroActivity.SHOW_INTRO="xyz_key" 如果,你对另一个常量使用相同的“xyz_key”,就会发生这个错误,所以 key 的值应该是唯一的。快乐编码:)

于 2016-03-30T08:57:56.063 回答
0

当我错误地在 XML 文件中为两个首选项提供了相同的 时,得到了这个异常android:key="your_key"

因此,仔细检查您的 settings.xml 可能会有所帮助。

于 2017-10-13T10:09:53.420 回答