首选项无法将java.lang.boolean强制转换为字符串

首选项无法将java.lang.boolean强制转换为字符串,java,android,sharedpreferences,Java,Android,Sharedpreferences,我有以下的优先等级: public class AppPreferencesActivity extends PreferenceActivity { private SharedPreferences appPrefs; private SharedPreferences.Editor prefEditor; private Mediator mediator; private SharedPreferences.OnSharedPreferenceChange

我有以下的优先等级:

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

            }

显然,某些pref被检查,并且只返回布尔值。 所以你不能直接使用它

for (Entry<String, ?> key : appPrefs.getAll().entrySet()) {
    findPreference(key.getKey()).setSummary(appPrefs.getString(key.getKey(), "Not yet entered"));
}
for(条目键:appPrefs.getAll().entrySet()){
FindReference(key.getKey()).setSummary(appPrefs.getString(key.getKey(),“尚未输入”);
}
我想也许你应该这样使用:

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);
}
for(条目键:appPrefs.getAll().entrySet()){
对象结果=key.getValue();
if(布尔值的结果实例){
//布尔句柄
}else if(字符串的结果实例){
//手柄串
}
FindReference(key.getKey()).setSummary(结果);
}

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

我也遇到了同样的错误。我去删除了应用程序的数据,我的应用程序不再崩溃。

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


修复:清除应用程序数据

显示完整的堆栈跟踪请打印堆栈跟踪-编辑刚刚注意到大小更新图像为什么要上载图像?只需复制粘贴堆栈跟踪。@Thihara Updated post为了节省其他人搜索此错误的时间,如果您不小心使用了
CheckBoxPreference
而不是
EditTextPreference
,至少对于数字输入类型,也会发生这种情况。在调用
addPreferencesFromResource()
时,Android只会抛出一个无用的错误,即它无法将字符串转换为布尔值。感谢您的响应。但是我所有的首选项都是editText。默认情况下,映射是否可能包含布尔值?您在其他文件中使用了其他首选项吗?如果将PreferenceActivity作为设置写入,则默认情况下,所有值都将保存在DefaultSharedReferences中。您可以从设备中提取xml文件以检查所有首选项。xml文件将保存在设备中的data/data/yourpackages/shared_prefs/yourpackage_preferences.xml中。这也为我解决了这个问题。在开发过程中,我错误地将错误的类型保存到保存的首选项中,当我使用正确的类型实现首选项时,它继续使我的应用程序崩溃。这也为我修复了崩溃。发生的事情是,我正在学习一个在线教程,所以首选项的键被通用地命名,比如“key1”和“key2”。我换了他们的类型,但保留了钥匙,那就是撞车开始的时候。清除应用程序数据允许继续开发。解决了我的问题tooo,非常感谢您节省了大量时间。这可能是事实,但您是否测试了如果再次更改有问题的值会发生什么情况?不,我没有。
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);
}