15

非常に奇妙なエラーが発生します。私には2つの活動があります。両方で、 私が呼んでいる各アクティビティで(重要な場合は)SharedPreferences使用していますMODE_PRIVATEsp = 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

私はそれを仮定しています

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 に答える
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 に答える
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

これは、誰もがキーで犯すよくある間違いです。IntroActivity.SHOW_INTRO= "xyz_key"の場合、同じ "xyz_key"を別の定数に使用すると、このエラーが発生するため、キーの値は一意である必要があります。ハッピーコーディング:)

于 2016-03-30T08:57:56.063 に答える
0

誤って、XMLファイルで2つのプリファレンスに同じ キーandroid:key="your_key"を指定した場合に、この例外が発生しました。

したがって、settings.xmlを再確認すると役立つ場合があります。

于 2017-10-13T10:09:53.420 に答える