Переключатель compact Android SharedPreferences не работает

#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();
                    }