Ответ 1
Если бы когда-либо была строка с этим ключом, даже если она случайно, она останется там до тех пор, пока вы не очистите данные приложения или не удалите. Попробуйте удалить его, чтобы увидеть, все ли это происходит.
Я получаю очень странную ошибку.
У меня есть 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
Если бы когда-либо была строка с этим ключом, даже если она случайно, она останется там до тех пор, пока вы не очистите данные приложения или не удалите. Попробуйте удалить его, чтобы увидеть, все ли это происходит.
Исключение происходит в этом методе 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
для строки в другом месте вашего кода.
Я предполагаю, что
sp.getBoolean(IntroActivity.SHOW_INTRO, true)// this line returns a String value.
чтобы вы могли сделать это
boolean showIntro = Boolean.parseBoolean(sp.getBoolean(IntroActivity.SHOW_INTRO, true));
Используйте приведенный ниже код для установки логического значения в 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);
Линия 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;
}
Попробуйте это, это определенно будет работать.
Это распространенная ошибка, которую все будут делать с помощью ключа, Я предполагаю IntroActivity.SHOW_INTRO = "xyz_key", если вы используете ту же "xyz_key" для другой константы, эта ошибка будет иметь место, поэтому значение ключа должно быть уникальным.. Счастливое кодирование:)
Получено это исключение, когда по ошибке я дал двум параметрам тот же ключ в файле XML android:key="your_key"
!
Так что двойная проверка ваших настроек .xml может помочь.