Reputation: 143
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
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
Reputation: 18032
You should also restore its state also in the onCreate method after switchState is assigned:
mWorkingSwitch.setChecked(switchState);
Upvotes: 1
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