2013-05-02 2 views
3

У меня есть следующий класс предпочтений:Предпочтение не может бросить java.lang.Boolean в строку

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

Полный StackTrace в тексте:

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

+0

Загрузили печать трассировки стеки - Edit просто заметила обновления размера –

+0

Почему вы загрузите изображение? Просто скопируйте пачку трассировки стека. – Thihara

ответ

6

Это, очевидно, что некоторые префы проверяются и только возвращают логическое значение. Таким образом, вы не можете использовать это напрямую.

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

+0

Благодарим за отзыв, но все мои предпочтения - это editText, возможно ли, что по умолчанию карта содержит логическое значение? –

+2

Есть ли у вас другие предпочтения в другом файле? Если вы пишете настройки PreferenceActivity в качестве параметров, все значения будут сохранены в DefaultSharedPreferences по умолчанию. Вы можете вытащить файл xml с устройства, чтобы проверить все предпочтения. Файл xml будет сохранен в вашем файле данных/данных/yourpakcages/shared_prefs/yourpackage_preferences.xml. – buptcoder

0

Я получаю эту ошибку тоже, и не мог понять, почему. Я думаю, это потому, что я добавил новое предпочтение и снова попробовал запустить приложение. Я удалил приложение, а затем снова запустил его с новыми настройками, и он сработал. Возможно, для сброса файла sharedpreferences понадобилась полная очистка.

14

У меня была такая же ошибка. Я пошел и удалил данные приложения, и мое приложение больше не разбивается.

+0

Это решило это и для меня. Я ошибочно сохранил неправильный тип в моих сохраненных предпочтениях во время разработки, и он продолжал сбой моего приложения, когда я реализовал предпочтение с правильным типом. – seato

+1

Для меня это тоже сработало. Случилось так, что я следовал онлайн-учебнику, поэтому ключи предпочтений были названы в общем виде, например «key1» и «key2». Я переключил их типы, но сохранил ключи, и именно тогда начался сбой. Очистка данных приложений позволила продолжить разработку. –

+0

Решила мою проблему tooo, спасибо много за экономию много времени –

2

У меня тоже была эта ошибка. Это случилось, когда у меня сначала была опция checkbox, затем использовалось то же имя для предпочтения списка, но на моем телефоне в настройках он все еще сохранялся как логическое, и он пытался загрузить его в мой список.

починка: четкие данные приложения

Смежные вопросы