Android 保存开关按钮状态为';行不通
我有一个开关按钮用于设置应用程序的声音打开和关闭,虽然它工作正常,但当我关闭应用程序,然后再次打开它。。开关自动变为Android 保存开关按钮状态为';行不通,android,sharedpreferences,toggle,togglebutton,android-togglebutton,Android,Sharedpreferences,Toggle,Togglebutton,Android Togglebutton,我有一个开关按钮用于设置应用程序的声音打开和关闭,虽然它工作正常,但当我关闭应用程序,然后再次打开它。。开关自动变为false。。!? 我试图通过共享首选项库保存上一个状态,但我不清楚如何正确保存 这就是我尝试使用Hawk // .... bool soundON = Hawk.get("sound"); // NPE !!! if (soundON) { soundSwitch.setChecked(true); soundSwitch.setSelected
false
。。!?
我试图通过共享首选项库保存上一个状态,但我不清楚如何正确保存
这就是我尝试使用Hawk
// ....
bool soundON = Hawk.get("sound"); // NPE !!!
if (soundON) {
soundSwitch.setChecked(true);
soundSwitch.setSelected(true);
} else {
soundSwitch.setChecked(false);
soundSwitch.setSelected(false);
}
soundSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
isSoundEnabled = true;
Hawk.put("sound", true);
} else {
isSoundEnabled = false;
}
Log.i("is checked sound", isChecked + "");
}});
更新-解决方案
我用了@Shrikant的答案,但只做了一点小改动。!我使用了Boolean
而不是Boolean
,因此我可以检查null
值,这是Boolean
允许的,因为它可以是true
或false
或null
而不是Boolean
,后者可以是true
或false
这是密码
Boolean isSound = Hawk.get("sound");
if (isSound == null) {
// I want the sound to be ON by default so I set it to true
soundSwitch.setChecked(true);
soundSwitch.setSelected(true);
} else {
soundSwitch.setChecked(isSound);
soundSwitch.setSelected(isSound);
Log.i("Sound State > ", isSound + "");
}
在onCreate()
方法中,您必须检查isSoundEnabled from shared preference是否已从局部变量检查
试试这个:
bool soundValue = Hawk.get("sound");
if (soundValue) {
soundSwitch.setChecked(true);
soundSwitch.setSelected(true);
} else {
soundSwitch.setChecked(false);
soundSwitch.setSelected(false);
}
而不是:
if (isSoundEnabled) {
soundSwitch.setChecked(true);
soundSwitch.setSelected(true);
} else {
soundSwitch.setChecked(false);
soundSwitch.setSelected(false);
}
在onCreate()
中的onCreate()
方法中,您必须从共享首选项检查isSoundEnabled,无论您是否从局部变量检查它
试试这个:
bool soundValue = Hawk.get("sound");
if (soundValue) {
soundSwitch.setChecked(true);
soundSwitch.setSelected(true);
} else {
soundSwitch.setChecked(false);
soundSwitch.setSelected(false);
}
而不是:
if (isSoundEnabled) {
soundSwitch.setChecked(true);
soundSwitch.setSelected(true);
} else {
soundSwitch.setChecked(false);
soundSwitch.setSelected(false);
}
在onCreate()
中,尝试以下操作
在onCreate()init中
Hawk.init(context).build();
之后,从Hawk获取声音值并将其设置为switch
boolean isSound = Hawk.get("some",false);
soundSwitch.setChecked(isSound);
soundSwitch.setSelected(isSound);
没有必要通过if-else检查布尔值
soundSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.i("is checked sound", isChecked + "");
Hawk.put("sound", isChecked);
}
});
我使用了Hawk的2.0.1版本。试试这个
在onCreate()init中
Hawk.init(context).build();
之后,从Hawk获取声音值并将其设置为switch
boolean isSound = Hawk.get("some",false);
soundSwitch.setChecked(isSound);
soundSwitch.setSelected(isSound);
没有必要通过if-else检查布尔值
soundSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.i("is checked sound", isChecked + "");
Hawk.put("sound", isChecked);
}
});
我使用了Hawk的2.0.1版本。您应该在setOnCheckedChangeListener调用时保存检查状态。并在onCreate调用时获取检查状态。您应该在setOnCheckedChangeListener调用时保存检查状态。并在onCreate调用时获取检查状态。我不明白你的意思,请你详细说明一下。我做到了。。!第一个代码是在我使用共享首选项之前,第二个代码是在我使用共享首选项时。。!它给我空指针异常。我将删除第一个代码以消除混淆请尝试使用Hawk.put(“声音”,false);在其他情况下,让我知道这个库是否正确地存储了值。我不明白你的意思,请你详细说明一下。我做到了。。!第一个代码是在我使用共享首选项之前,第二个代码是在我使用共享首选项时。。!它给我空指针异常。我将删除第一个代码以消除混淆请尝试使用Hawk.put(“声音”,false);在else条件下,让我知道此库是否正确存储了值。它给我这一行的npe错误>
boolean isSound=Hawk.get(“sound”)代码>&错误>java.lang.RuntimeException:无法启动活动组件信息{com…设置}:java.lang.NullPointerException:尝试调用虚拟方法'boolean java.lang.boolean.booleanValue()'在空对象引用上
您是否可以发布错误日志,如监视器和您使用的hawk版本中所示?我使用的是hawk:2.0.1
&没有日志显示,因为启动活动后会发生崩溃>isSound
当活动第一次运行时将为空
,因为hawk值尚未保存。。!所以我用try and catch
来包围它,这样它就可以忽略npe,因为它只会发生一次。。!但奇怪的是,每次我打开活动时,npe都会出现,我检查了hawk值,它被正常存储,但是isSound
始终等于null
,而它位于try
块内。。。!有什么想法吗?我用Boolean
而不是Boolean
解决了这个问题,因为Boolean
可以null
我可以用if语句检查它。。!非常感谢你,伙计。我将在更新中添加最终代码。!它给我这行的npe错误>boolean isSound=Hawk.get(“sound”)代码>&错误>java.lang.RuntimeException:无法启动活动组件信息{com…设置}:java.lang.NullPointerException:尝试调用虚拟方法'boolean java.lang.boolean.booleanValue()'在空对象引用上
您是否可以发布错误日志,如监视器和您使用的hawk版本中所示?我使用的是hawk:2.0.1
&没有日志显示,因为启动活动后会发生崩溃>isSound
当活动第一次运行时将为空
,因为hawk值尚未保存。。!所以我用try and catch
来包围它,这样它就可以忽略npe,因为它只会发生一次。。!但奇怪的是,每次我打开活动时,npe都会出现,我检查了hawk值,它被正常存储,但是isSound
始终等于null
,而它位于try
块内。。。!有什么想法吗?我用Boolean
而不是Boolean
解决了这个问题,因为Boolean
可以null
我可以用if语句检查它。。!非常感谢你,伙计。我将在更新中添加最终代码。!在存储数据和onCreate获取数据的位置,添加数据的logcat打印以查看值是否为预期数字。在存储数据和onCreate获取数据的位置,添加数据的logcat打印以查看值是否为预期数字。