#android #sharedpreferences #android-switch
#Android #sharedpreferences #android-переключатель
Вопрос:
SharedPreferences в приведенном ниже коде работает не так, как требуется. Где я ошибаюсь? Общие настройки сохраняются при нажатии, и те же значения is извлекаются при создании и повторном использовании в моей активности Android.
Код:
mySwitch = (SwitchCompat) findViewById(R.id.atten);
strttime = (TextView) findViewById(R.id.textView5);
endtime = (TextView) findViewById(R.id.textView6);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
silent = settings.getBoolean("switchkey", false);
mySwitch.setChecked(silent);
mySwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final SwitchCompat btn = (SwitchCompat) v;
final boolean switchChecked = silent;
String message = "Are you sure you want to Logout?";
if (!btn.isChecked()) {
message = "Are you sure you want to Login?";
}
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.MyAlertDialogStyle); // Change "this" to `getActivity()` if you're using this on a fragment
builder.setMessage(message).setPositiveButton("Ok", new DialogInterface.OnClickListener() {@Override
public void onClick(DialogInterface dialog, int i) {
// "Yes" button was clicked
if (switchChecked) {
Log.d("You are :", "Checked");
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("switchkey", true);
editor.apply();
} else {
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("switchkey", false);
editor.apply();
}
}
}).setNegativeButton("Cancel", null).show();
}
});
Комментарии:
1. вы забыли упомянуть, где вы получаете неправильное значение, сохраненное sharedperference в
onCreate
илиonResume
Ответ №1:
Это происходит из-за final boolean switchChecked = silent;
внутри вашего setOnClickListener
вы передаете значение silent в switchChecked
и из-за этого значение silent всегда равно false silent = settings.getBoolean("switchkey", false);
(если значение недоступно)
итак, все, что вам нужно сделать, это передать правильное значение в switchChecked
следующим образом
final boolean switchChecked = btn.isChecked();
потому что вам нужно проверить, нажал пользователь ваш переключатель или нет
теперь switchChecked
будет иметь правильное значение в соответствии с пользовательским вводом
таким образом, ваш код будет
mySwitch = (SwitchCompat) findViewById(R.id.atten);
strttime = (TextView) findViewById(R.id.textView5);
endtime = (TextView) findViewById(R.id.textView6);
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
silent = settings.getBoolean("switchkey", false);
mySwitch.setChecked(silent);
mySwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final SwitchCompat btn = (SwitchCompat) v;
final boolean switchChecked = btn.isChecked();
String message = "Are you sure you want to Logout?";
if (!btn.isChecked()) {
message = "Are you sure you want to Login?";
}
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage(message)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
// "Yes" button was clicked
if (switchChecked) {
Log.d("You are :", "Checked");
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("switchkey", true);
editor.apply();
} else {
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("switchkey", false);
editor.apply();
}
}
})
.setNegativeButton("Cancel", null)
.show();
}
});
Комментарии:
1. это исправлено!!
Ответ №2:
Почему у вас, похоже, есть два разных SwitchCompat
представления, называемых mySwitch
и btn
? Трудно сказать, чего вы пытаетесь достичь.
В любом случае, попробуйте это вместо того, чтобы получить информацию о состоянии SwitchCompat
:
builder.setMessage(message)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("switchkey", mySwitch.isChecked());
//or maybe you want btn.isChecked()? I don't know
editor.apply();
}