首选项无法将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);
}