Poo
Poo

Reputation: 143

Keep switch checked in Android application

I have a switch in my Android app. I want to keep that checked until I off it (even I back pressed or open another application). Below is the code that I have tried.

mWorkingSwitch = (Switch) findViewById(R.id.workingSwitch);
SharedPreferences prefs = getSharedPreferences("com.bitproject.driverapplication", MODE_PRIVATE);
boolean switchState = prefs.getBoolean("service_status", false);
mWorkingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
         if (isChecked) {
             connectDriver();
         } else {
             disconnectDriver();
         }
     }
});
mWorkingSwitch.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         SharedPreferences.Editor editor = getSharedPreferences("com.bitproject.driverapplication", MODE_PRIVATE).edit();
         editor.putBoolean("service_status", mWorkingSwitch.isChecked());
         editor.commit();
     }
});

When I backpressed (while switch is checked), and again go to that activity (where the switch is in), that switch has become off.

I want to keep it on until I off it. There are some similar questions but I can't understand how to relate those to my problem. I'm new to Android.

Upvotes: 1

Views: 991

Answers (3)

Manohar
Manohar

Reputation: 23404

Ok here is the fixed code , you should be saving state in on OnCheckedChangeListener and setting state back with mWorkingSwitch.setChecked(switchState);

mWorkingSwitch = (Switch) findViewById(R.id.workingSwitch);
SharedPreferences prefs = getSharedPreferences("com.bitproject.driverapplication", MODE_PRIVATE);
boolean switchState = prefs.getBoolean("service_status", false);
 mWorkingSwitch.setChecked(switchState);
mWorkingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
         if (isChecked) {
             connectDriver();
         } else {
             disconnectDriver();
         }

 SharedPreferences.Editor editor = getSharedPreferences("com.bitproject.driverapplication", MODE_PRIVATE).edit();
         editor.putBoolean("service_status",isChecked);
         editor.commit();
     }
});

You should not be setting onClickListener for switch

Upvotes: 1

jeprubio
jeprubio

Reputation: 18032

You should also restore its state also in the onCreate method after switchState is assigned:

mWorkingSwitch.setChecked(switchState);

Upvotes: 1

Hasan Bou Taam
Hasan Bou Taam

Reputation: 4035

Save state in shared preferences in setOnCheckedChangeListener:

......
......               
if (isChecked) {
connectDriver();

//switch is checked
SharedPreferences.Editor editor = getSharedPreferences("switch", MODE_PRIVATE).edit();
editor.putString("state", "checked");
editor.apply();

} else {
disconnectDriver();

//switch is unchecked
SharedPreferences.Editor editor = getSharedPreferences("switch", MODE_PRIVATE).edit();
editor.putString("state", "unchecked");
editor.apply();
}
......
...... 

Now in onStart() method of activity:

@Override
protected void onStart(){
super.onStart();

//read the state
SharedPreferences pref = getSharedPreferences("switch", MODE_PRIVATE); 
String state = pref.getString("state", "default");

if(state.equals("checked")){

//it was checked

mWorkingSwitch.setChecked(true);

}else{

//it was unchecked

mWorkingSwitch.setChecked(false);

}

}

Upvotes: 1

Related Questions