AGAIN:第36行是:ToPushVar = mPrefs.getBoolean(“PushNotifications”,true);
我今天开始创建一个简单的rss阅读器。我想将设置存储在共享首选项中。这是我的保存代码(使用alertdialogs进行调试):
public void toSave(View v) {
SharedPreferences prefs = getSharedPreferences(
"bdapps.ujsag_frisshirekatelefonodon", Context.MODE_PRIVATE);
String NewsPaperSetting;
boolean ToPush = ((Switch)findViewById(R.id.pushNotifications)).isChecked();
boolean Newspaper =( (Switch)findViewById(R.id.integratedReader)).isChecked();
SharedPreferences.Editor mEditor = prefs.edit();
mEditor.clear();
mEditor.putBoolean("PushNotifications", ToPush);
mEditor.putBoolean("UseReader", Newspaper);
mEditor.apply();
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("Változók értékei:");
alertDialog.setMessage("Mentés:" + ToPush + Newspaper);
alertDialog.show();
SharedPreferences mPrefs = getSharedPreferences("bdapps.ujsag_frisshirekatelefonodon", 0);
boolean SendNotifications, UseBDReader;
Boolean ToPushVar = mPrefs.getBoolean("PushNotifications", false);
Boolean abc = mPrefs.getBoolean("PushNotifications", false);
AlertDialog dia = new AlertDialog.Builder(this).create();
dia.setTitle("Változók értékei:");
dia.setMessage("Üzenetek küldése:" +ToPushVar + " Olvasó: " + abc );
dia.show();
}
调试表明它成功保存了带有true或false值的变量,但是当我重新启动应用程序时,它会出现以下错误:
引起:java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Boolean
我阅读价值观的方法:
public void RetrieveValues() {
boolean ToPushVar;
boolean Reader;
SharedPreferences mPrefs = getSharedPreferences("bdapps.ujsag_frisshirekatelefonodon", 0);
ToPushVar = mPrefs.getBoolean("PushNotifications", true); /* Here I got the error*/
Reader = mPrefs.getBoolean("UseReader", false);
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("Változók értékei:");
alertDialog.setMessage("Üzenetek küldése:" + ToPushVar + " Olvasó: " + Reader);
alertDialog.show();
}
完整的堆栈跟踪:
8-24 10:04:04.068 6476-6476/bdapps.ujsag_frisshirekatelefonodon E/AndroidRuntime: FATAL EXCEPTION: main
Process: bdapps.ujsag_frisshirekatelefonodon, PID: 6476
java.lang.RuntimeException: Unable to start activity ComponentInfo{bdapps.ujsag_frisshirekatelefonodon/bdapps.ujsag_frisshirekatelefonodon.MainActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2699)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2773)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1434)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5930)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:260)
at bdapps.ujsag_frisshirekatelefonodon.MainActivity.RetrieveValues(MainActivity.java:36) at bdapps.ujsag_frisshirekatelefonodon.MainActivity.onCreate(MainActivity.java:76) at android.app.Activity.performCreate(Activity.java:6178)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2652)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2773)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1434)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5930)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
我找到了解决方案。发生错误,因为还有其他数据类型(字符串)的值。我需要重新安装应用程序来修复它。感谢DsD!
答案 0 :(得分:0)
apply(),它提交时没有返回表示成功或失败的布尔值。
如果保存起作用,commit()将返回true,否则返回false。
apply()被添加,因为Android开发团队注意到几乎没有人注意到返回值,因此apply更快,因为它是异步的。
答案 1 :(得分:0)
在onCreate方法中初始化按钮,如下所示
Switch btn_switch = (Switch) findViewById(R.id.pushNotifications);
然后在保存方法中使用它
boolean ToPush = btn_switch.isChecked();
还尝试重建您的项目,有时它会修复主要问题
答案 2 :(得分:0)
根据android开发人员link,如果存在此名称不是布尔值的首选项,则getBoolean会抛出ClassCastException。因此,您可以通过更改“PushNotifications”键来检查,或者您可以卸载应用程序并再次安装。
答案 3 :(得分:0)
如果您正在运行模拟器。尝试运行新设备并进行检查。可能会正常工作。 如果您最初遇到字符串转换错误,后来又进行了更正,但在多次清理和重建项目后,该错误可能仍然存在。
重新安装也可以。 但是我在Nexus 6中收到错误消息,然后切换到Nexus 4并正常工作。
答案 4 :(得分:-1)
试试这个
SharedPreferences mPrefs = getSharedPreferences("bdapps.ujsag_frisshirekatelefonodon", 0);
boolean SendNotifications, UseBDReader;
boolean ToPushVar = mPrefs.getBoolean("PushNotifications", false);
boolean abc = mPrefs.getBoolean("PushNotifications", false);
使用布尔代替布尔