Home > Blockchain >  SharedPreferences check box not saving correctly
SharedPreferences check box not saving correctly

Time:10-26

I'm making a simple login with a checkbox. My sharedpreferences xml file does not contain the boolean statement at the very first login so the checkbox goes through as unchecked. For all users' first login, the checkbox value does not correctly reflect. I have to interact with the checkbox (click to check/uncheck) for it to work but after that, the succeeding tries work fine. What have I missed?

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EditText lUsername = (EditText) findViewById(R.id.lUsername);
    EditText lPassword = (EditText) findViewById(R.id.lPassword);
    Button btnSignin = (Button) findViewById(R.id.btnSignin);
    CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox);

    btnSignin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View v) {

            String username = lUsername.getText().toString();
            String password = lPassword.getText().toString();

            SharedPreferences preferences = getSharedPreferences("MYPREFS", MODE_PRIVATE);                

            String details = preferences.getString(username   password   "data", "invalid");
            SharedPreferences.Editor editor = preferences.edit();

            if (details == "invalid") {
               Toast.makeText(MainActivity.this, "Invalid credentials", Toast.LENGTH_SHORT).show();
            } else {
                checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                        if(checkBox.isChecked()) {
                            editor.putBoolean("checked", true);
                        }else{
                            editor.putBoolean("checked", false);
                        }
                        editor.commit();
                    }
                });
                Intent displayScreen = new Intent(MainActivity.this, activity2.class);
                startActivity(displayScreen);
            }
   }
});

DisplayScreen.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.DisplayScreen);

    SharedPreferences preferences = getSharedPreferences("MYPREFS", MODE_PRIVATE);

    String username = preferences.getString("username", "invalid");

    if(preferences.contains("checked") && preferences.getBoolean("checked",false) == true) {
        String data = preferences.getString("data", "Hello senior "   username   "!");
        TextView displayInfo = (TextView) findViewById(R.id.helloDisplay);
        displayInfo.setText(data);
    }else {
        String data = preferences.getString("data", "Hello "   username   "!");
        TextView displayInfo = (TextView) findViewById(R.id.helloDisplay);
        displayInfo.setText(data);
    }
}

CodePudding user response:

It is because you have used checkBox.setOnCheckedChangeListener() this will only be triggered when you interact with the checkBox. If you want to save some default value in sharedPreferences just store it before you do anything, also declare sharedPreferences and other things outside your button clickListener not inside.

Button btnSignin = (Button) findViewById(R.id.btnSignin);
CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox);

SharedPreferences preferences = getSharedPreferences("MYPREFS", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();   
editor.putBoolean("checked", false);    //for default case

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if(checkBox.isChecked()) {
                        editor.putBoolean("checked", true);
                    }else{
                        editor.putBoolean("checked", false);
                    }
                    editor.commit();
                }
            });

btnSignin.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick (View v) {
            String username = lUsername.getText().toString();
            String password = lPassword.getText().toString();
            String details = preferences.getString(username   password   "data", "invalid");
            if (details == "invalid") {
               Toast.makeText(MainActivity.this, "Invalid credentials", Toast.LENGTH_SHORT).show();
            } else {
                Intent displayScreen = new Intent(MainActivity.this, activity2.class);
            startActivity(displayScreen);
            }
        }
    });

CodePudding user response:

You are calling checkBox.setOnCheckedChangeListener inside of btnSignin.setOnClickListener which you are calling startActivity(displayScreen). So you never get the checkbox changes for the first time. But if you navigate back to the MainActivity you will get the checkbox changes because checkBox.setOnChecked ChangeListener is already set.

Here is an approach you can use. You can always call checkBox.isChecked() method to check if the checkbox is checked or not; which in your case is better to call this method instead of setting checkBox.setOnCheckedChangeListener. So your code will become like this:

@Override
protected void onCreate(Bundle savedInstanceState) {

    ...

    btnSignin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View v) {

            ...

            if (details == "invalid") {
               ...
            } else {
                if(checkBox.isChecked()) {
                    editor.putBoolean("checked", true);
                } else {
                    editor.putBoolean("checked", false);
                }
                editor.commit();
               ...
            }
        }
    });
}

For the sake of simplicity you can even do it like this:

@Override
protected void onCreate(Bundle savedInstanceState) {

    ...

    btnSignin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View v) {

            ...

            if (details == "invalid") {
               ...
            } else {
                editor.putBoolean("checked", checkbox.isChecked());
                editor.commit();
               ...
            }
        }
    });
}

Which makes your code more readable.

  • Related