2012-10-12 18 views
14

Tôi gặp lỗi rất lạ. Tôi có 2 hoạt động. Trên cả tôi nhận được SharedPreferences sử dụng MODE_PRIVATE (nếu vấn đề) bởi sp = getPreferences(MODE_PRIVATE); trên mỗi hoạt động onCreate() Tôi gọi sp.getBoolean(IntroActivity.SHOW_INTRO, true)Ngoại lệ lạ: Không thể truyền chuỗi sang Boolean khi sử dụng getBoolean

Trên IntroActivity này làm việc tốt. Nhưng khi tôi đang cố gắng trong hoạt động chính, tôi nhận được này

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) 

Tôi chắc chắn rằng tôi sẽ không đặt một đâu đó String ở giữa với cùng chìa khóa

ý tưởng Bất kỳ?

Cảm ơn!

EDIT: một số mã:

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

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

Nếu vấn đề, mã mà ném ngoại lệ là bên trong của một nút onClick

+0

Bạn có thể đăng mã để các lập trình viên giúp bạn không? :) –

+0

Bạn cần mã nào? Tôi đã viết mọi thứ liên quan đến SharedPrefernces .. –

+0

trong ParkMeActivity.java –

Trả lời

45

Nếu có một chuỗi với khóa đó, ngay cả khi vô tình, nó sẽ ở đó cho đến khi bạn xóa dữ liệu hoặc gỡ cài đặt của ứng dụng. Hãy thử gỡ cài đặt nó để xem nó vẫn xảy ra.

+0

Vâng, Nó hoạt động .. kỳ lạ là nó hoạt động trên một hoạt động và mặt khác nó đã ném ngoại lệ, nhưng sau khi gỡ cài đặt và cài đặt lại nó hoạt động .. Cảm ơn! –

+0

Bạn có 'commit()' hoặc 'apply()' sau 'clear()' không? Ngoài ra, sở thích là cá nhân cho từng hoạt động. Nếu bạn muốn thực sự * chia sẻ * chúng, hãy tạo chúng với một hoạt động đơn lẻ, không phải cả hai. – Geobits

+0

Tôi đã làm, nhưng chỉ trong một hoạt động. Bây giờ tôi đang nhận SharedPreferences cùng một cách @Nishant nói và chia sẻ chúng. Tôi đã không nhận ra rằng cách tôi đã làm nó, tôi đã không chia sẻ, và chỉ xóa một lần. Đó là lý do tại sao một người làm việc và một người thì không. Cảm ơn! –

1

Tôi giả định rằng

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

để bạn có thể làm như thế này

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

Đã thử rằng, nhận được lỗi biên dịch 'Phương thức parseBoolean (String) trong kiểu Boolean không áp dụng cho các đối số (boolean)' bởi vì dòng đầu tiên trả về một boolean –

3

Trường hợp ngoại lệ xảy ra trong phương pháp Android này:

public boolean getBoolean(String key, boolean defValue) { 
    synchronized (this) { 
     awaitLoadedLocked(); 
     Boolean v = (Boolean)mMap.get(key); // On this line 
     return v != null ? v : defValue; 
    } 
} 

Ý nghĩa duy nhất tôi có thể làm cho lỗi này là bạn đang sử dụng lại chìa khóa IntroActivity.SHOW_INTRO cho một String ở một nơi khác trong mã của bạn.

1

Sử dụng mã dưới đây để thiết lập giá trị boolean trong SharedPreference:

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

Và để lấy giá trị boolean từ SharedPreference sử dụng mã này:

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

Dòng sp.getBoolean (IntroActivity .SHOW_INTRO, true) // dòng này trả về một giá trị String.

vì vậy bạn phải làm là đưa ra dưới đây,

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

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

Hãy thử điều này nó chắc chắn sẽ hoạt động.

+0

Sai. Điều này sẽ sụp đổ trong một thiết bị khác. – Avijit

0

Đây là sai lầm phổ biến mà mọi người sẽ thực hiện bằng khóa, Tôi đoán IntroActivity.SHOW_INTRO = "xyz_key" nếu, Bạn sử dụng cùng một "xyz_key" cho một Hằng số khác Lỗi này sẽ xảy ra sao cho giá trị của khóa phải là độc nhất..Chúc mừng mã hóa :)

0

Got ngoại lệ này khi nào, do nhầm lẫn, tôi đã trao cho hai sở thích cùngchính trong file XML android:key="your_key"!

Vì vậy, việc kiểm tra kỹ tệp settings.xml của bạn có thể hữu ích.

Các vấn đề liên quan