Необычное исключение: нельзя использовать String для Boolean при использовании getBoolean - программирование
Подтвердить что ты не робот

Необычное исключение: нельзя использовать String для Boolean при использовании getBoolean

Я получаю очень странную ошибку. У меня есть 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 где-то посередине с тем же ключом

Любые идеи?

Спасибо!

EDIT: некоторый код:

//onCreate()
sp = getPreferences(MODE_PRIVATE);

// other method
boolean showIntro = sp.getBoolean(IntroActivity.SHOW_INTRO, true); // Exception is here
showIntroCheckBox.setChecked(showIntro);

Если это имеет значение, код, который генерирует исключение, находится внутри кнопки onClick

4b9b3361

Ответ 1

Если бы когда-либо была строка с этим ключом, даже если она случайно, она останется там до тех пор, пока вы не очистите данные приложения или не удалите. Попробуйте удалить его, чтобы увидеть, все ли это происходит.

Ответ 2

Исключение происходит в этом методе 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 для строки в другом месте вашего кода.

Ответ 3

Я предполагаю, что

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

чтобы вы могли сделать это

boolean showIntro = Boolean.parseBoolean(sp.getBoolean(IntroActivity.SHOW_INTRO, true));

Ответ 4

Используйте приведенный ниже код для установки логического значения в 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);

Ответ 5

Линия   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;
}

Попробуйте это, это определенно будет работать.

Ответ 6

Это распространенная ошибка, которую все будут делать с помощью ключа, Я предполагаю IntroActivity.SHOW_INTRO = "xyz_key", если вы используете ту же "xyz_key" для другой константы, эта ошибка будет иметь место, поэтому значение ключа должно быть уникальным.. Счастливое кодирование:)

Ответ 7

Получено это исключение, когда по ошибке я дал двум параметрам тот же ключ в файле XML android:key="your_key"!

Так что двойная проверка ваших настроек .xml может помочь.