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打印以查看值是否为预期数字。