6

我有以下偏好类:

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

我在调用 setSumary 的循环中收到此错误,谁能告诉我为什么会这样?

更新

文本中的完整堆栈跟踪:

   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
4

4 回答 4

23

I was getting the same error. I went and deleted App's data and my app doesn't crash anymore.

于 2015-01-12T13:08:39.873 回答
7

It obviously that some prefs are checked and only return boolean value. So you cannot use this directly.

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

I think maybe you should use like that:

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);
}
于 2013-05-02T03:32:46.860 回答
7

我也有这个错误。当我第一次有一个复选框首选项时,它很高兴,然后使用相同的名称作为列表首选项,但在我的手机的首选项中,它仍然保存为布尔值,它试图将它加载到我的列表中。

修复:清除应用数据

于 2016-05-25T17:41:02.203 回答
0

我也遇到了这个错误,不知道为什么。我认为这是因为我添加了一个新的偏好并尝试再次运行该应用程序。我卸载了该应用程序,然后使用新的首选项再次运行它,它工作正常。也许它需要完全擦除才能重置 sharedpreferences 文件。

于 2014-09-29T18:03:52.513 回答