2012-10-12 192 views
14

Me aparece un error muy extraño. Tengo 2 actividades. En tanto que estoy recibiendo el SharedPreferencesMODE_PRIVATE usando (si es importante) por sp = getPreferences(MODE_PRIVATE); en cada actividad de onCreate() estoy llamando sp.getBoolean(IntroActivity.SHOW_INTRO, true)Excepción extraña: No se puede convertir String en booleano cuando se usa getBoolean

Por IntroActivity esto funciona bien. Pero cuando estoy tratando en la actividad principal, que estoy recibiendo este

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) 

que se aseguró de que no estoy poniendo un String algún lugar en el medio con la misma clave

¿Alguna idea?

Gracias!

EDIT: algo de código:

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

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

si importa, el código que produce la excepción está en el interior Estoy asumiendo de un botón onClick

+0

¿Se puede publicar el código para que los programadores lo ayuden? :) –

+0

¿Qué código necesitas? Escribí todo lo relacionado con SharedPrefernces ... –

+0

en ParkMeActivity.java –

Respuesta

45

Si alguna vez ha habido una cadena con esa clave, incluso si por accidente, permanecerá allí hasta que borre los datos de la aplicación o la desinstale. Intente desinstalarlo para ver si todavía ocurre.

+0

Bueno, funcionó .. Es extraño que funcionó en una actividad y en la otra arrojó la excepción, pero después de desinstalarla y volver a instalarla funciona ... ¡Gracias! –

+0

¿Has 'commit()' o 'apply()' después de 'clear()'? Además, las preferencias son individuales para cada actividad. Si quiere * compartirlos * realmente, créelos con una sola actividad, no con ambas. – Geobits

+0

Lo hice, pero solo en una actividad. Ahora estoy obteniendo las Preferencias Compartidas de la misma manera que dijo @Nishant y compartiéndolas. No me di cuenta de que por la forma en que lo hice, no estaba compartiendo, y solo aclaré una vez. Es por eso que uno funcionó y el otro no. Gracias! –

1

que

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

para que pueda hacer esto

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

Probé eso, obteniendo el error de compilación 'El método parseBoolean (String) en el tipo Boolean no es aplicable para los argumentos (booleanos)' porque la primera línea devuelve un booleano –

3

La excepción se da en este método 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; 
    } 
} 

El único sentido que puedo hacer de este error es que su vuelve a utilizar la tecla IntroActivity.SHOW_INTRO de una cadena en otra parte de su código.

1

Utilice el código siguiente para establecer el valor booleano en SharedPreference:

SharedPreferences appSharedPrefs = PreferenceManager 
      .getDefaultSharedPreferences(this.getApplicationContext()); 
    Editor prefsEditor = appSharedPrefs.edit(); 
    prefsEditor.putBoolean(IntroActivity.SHOW_INTRO, true); 
    prefsEditor.commit(); 

Y para recuperar el valor booleano de SharedPreference uso este código:

SharedPreferences appSharedPrefs = PreferenceManager 
      .getDefaultSharedPreferences(this.getApplicationContext()); 
    boolean showIntro = appSharedPrefs.getBoolean(IntroActivity.SHOW_INTRO, true); 
0

La línea sp.getBoolean (IntroActivity .SHOW_INTRO, verdadero) // esta línea devuelve un valor de cadena.

por lo que tiene que hacer como se indica a continuación,

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

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

probar este que sin duda funciona.

+0

incorrecto Esto se bloqueará en otro dispositivo. – Avijit

0

Este es el error común que todo el mundo va a hacer con la llave, supongo IntroActivity.SHOW_INTRO = "xyz_key" si, se utiliza la misma "xyz_key" para otro Constante este error se producirá por lo que el valor de la clave debe ser único..Feliz de codificación :)

0

Tienes esta excepción cuando, por error, me he dado a dos preferencias de la misma clave en el archivo XML android:key="your_key"!

Así que verificar dos veces su settings.xml puede ayudar.

Cuestiones relacionadas