2013-05-02 29 views
3

我有以下的優先級:偏好不能投java.lang.Boolean中爲String

public class AppPreferencesActivity extends PreferenceActivity { 
    private SharedPreferences appPrefs; 
    private SharedPreferences.Editor prefEditor; 
    private Mediator mediator; 
    private SharedPreferences.OnSharedPreferenceChangeListener listener; 
    private User user; 
    @SuppressWarnings("deprecation") 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //---load the preferences from an XML file--- 
     addPreferencesFromResource(R.xml.preferences); 
     this.appPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
     this.mediator = (Mediator) getApplication();  
     this.prefEditor = appPrefs.edit(); 
     this.user = mediator.getUser(); 
     setPreferences(); 
     listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
      public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
       // Implementation 
       updatePreference(key); 
       Toast.makeText(AppPreferencesActivity.this, 
         "Information updated", 
         Toast.LENGTH_SHORT).show(); 
      } 
     }; 
     appPrefs.registerOnSharedPreferenceChangeListener(listener); 

    } 
    private void setPreferences(){ 
     prefEditor.putString("nameEdit", user.getName() + " "+user.getLastName()); 
     prefEditor.putString("streetEdit", user.getStreetName()); 
     prefEditor.putString("streetNumberEdit", ""+user.getStreetNr()); 
     prefEditor.putString("emailEdit", user.getEmail()); 
     prefEditor.commit(); 
     preferenceAddSummary(); 
    } 
    public boolean checkEmailStatus(){ 
     return appPrefs.contains("emailEdit"); 
    } 
    @SuppressWarnings("deprecation") 
    private void preferenceAddSummary() { 
     for (Entry<String, ?> key : appPrefs.getAll().entrySet()) { 
      findPreference(key.getKey()).setSummary(appPrefs.getString(key.getKey(), "Not yet entered")); 
// this is where im getting the error 

      } 

然而,當我運行此我得到以下

無法施展java.lang.Boolean中來Java.lang.String

我得到這個錯誤在迴路im調用setSumary任何人都可以告訴我爲什麼會發生這種情況?

UPDATE

完整堆棧跟蹤文本:

05-02 02:28:15.835: E/AndroidRuntime(1775): FATAL EXCEPTION: main 
05-02 02:28:15.835: E/AndroidRuntime(1775): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.konkurrencesigner/com.example.konkurrencesigner.AppPreferencesActivity}: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.os.Looper.loop(Looper.java:137) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at dalvik.system.NativeStart.main(Native Method) 
05-02 02:28:15.835: E/AndroidRuntime(1775): Caused by: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:224) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at com.example.konkurrencesigner.AppPreferencesActivity.preferenceAddSummary(AppPreferencesActivity.java:55) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at com.example.konkurrencesigner.AppPreferencesActivity.setPreferences(AppPreferencesActivity.java:47) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at com.example.konkurrencesigner.AppPreferencesActivity.onCreate(AppPreferencesActivity.java:28) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.Activity.performCreate(Activity.java:5104) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
05-02 02:28:15.835: E/AndroidRuntime(1775):  ... 11 more 
+0

向我們展示了完整的堆棧跟蹤,請 – Patashu 2013-05-02 02:31:58

+0

上傳堆棧跟蹤打印 - 編輯只注意到大小更新圖像 – 2013-05-02 02:37:06

+0

你爲什麼要上傳圖片?只需複製粘貼堆棧跟蹤... – Thihara 2013-05-02 02:44:39

回答

6

這顯然是一些首選項進行檢查,並只返回boolean值。 所以你不能直接使用它。

for (Entry<String, ?> key : appPrefs.getAll().entrySet()) { 
    findPreference(key.getKey()).setSummary(appPrefs.getString(key.getKey(), "Not yet entered")); 
} 

我想,也許你應該這樣使用:

for (Entry<String, ?> key : appPrefs.getAll().entrySet()) { 
    Object result = key.getValue(); 
    if (result instanceof Boolean) { 
     //handle boolean 
    } else if (result instanceof String) { 
     //handle String 
    } 
    findPreference(key.getKey()).setSummary(result); 
} 
+0

+1良好的呼叫... – Thihara 2013-05-02 05:51:49

+0

謝謝您的回覆,但是我的所有偏好是editText默認情況下,地圖是否包含布爾值? – 2013-05-02 10:22:48

+2

在其他文件中是否還有其他偏好?如果您將PreferenceActivity設置爲設置,則默認情況下所有值都將保存在DefaultSharedPreferences中。您可以從設備中拉取xml文件以檢查所有首選項。 xml文件將保存在設備的data/data/yourpakcages/shared_prefs/yourpackage_preferences.xml中。 – buptcoder 2013-05-02 15:23:10

0

我太得到這個錯誤,並不能找出原因。我認爲這是因爲我添加了一個新的偏好,並嘗試再次運行該應用。我卸載了應用程序,然後使用新的首選項再次運行它,並且工作。也許它需要全面清除重置sharedpreferences文件。

14

我得到了同樣的錯誤。我去了,刪除了應用程序的數據,我的應用程序不再崩潰了。

+0

這也爲我解決了它。在開發過程中,我錯誤地將錯誤的類型保存到了我保存的偏好設置中,並且當我使用正確的類型實現首選項時,它繼續使應用程序崩潰。 – seato 2016-06-10 18:27:42

+1

這也修復了我的崩潰。發生了什麼是我正在關注一個在線教程,因此這些首選項的關鍵字被統稱爲「key1」和「key2」。我改變了他們的類型,但保留了鍵盤,這就是崩潰開始的時候。清除應用程序數據可以使開發繼續進行。 – 2016-12-29 07:30:55

+0

解決我的問題tooo,非常感謝您節省大量的時間 – 2017-03-16 03:18:36

2

我也有這個錯誤。當我第一次使用複選框首選項時,它很受歡迎,然後使用相同的名稱作爲列表首選項,但是在首選項中,它仍然保存爲布爾值,並嘗試將其加載到我的列表中。

修復:清除應用數據