Home > Mobile >  SharedPreferences Integers wont save
SharedPreferences Integers wont save

Time:02-02

I want to save two integers in SharedPreferences but they won't get saved. I have a RangeSlider with a min and max value. The slider values definetly get updated but when I save them and call sharedPreferences.getInt(...); the values are not saved. Shared Preferences has still the default value. Does anybody see what my mistake is?

Thanks in advance!

public class SettingsFragment extends Fragment {

    private FragmentSettingsBinding binding;
    private SettingsViewModel settingsViewModel;
    private SharedPreferences sharedPreferences;

    @Override
    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.binding = FragmentSettingsBinding.inflate(inflater, container, false);
        this.settingsViewModel = new ViewModelProvider(this).get(SettingsViewModel.class);
        this.settingsViewModel.setRepository(((MainActivity)getActivity()).getRepository());

        sharedPreferences =  requireActivity().getSharedPreferences(getString(R.string.app_name),Context.MODE_PRIVATE);

        this.binding.sliderMinMaxSetting.addOnChangeListener(new RangeSlider.OnChangeListener() {
            @Override
            public void onValueChange(@NonNull @NotNull RangeSlider slider, float value, boolean fromUser) {
                sharedPreferences.edit().putInt(getString(R.string.settingMin), Math.round(slider.getValues().get(0)));
                sharedPreferences.edit().putInt(getString(R.string.settingMax), Math.round(slider.getValues().get(1)));
                sharedPreferences.edit().commit();

                int min = sharedPreferences.getInt(getString(R.string.settingMin), getResources().getInteger(R.integer.settingMinDefaultValue));
                Log.d("SettingsFragment", "minSharedPref : "   min   ", minSlider : "   Math.round(slider.getValues().get(0))); // Result: slider value is updated but not shared preferences

            }
        });       

        this.binding.buttonResetSettings.setOnClickListener(v -> {

            sharedPreferences.edit().putInt(getString(R.string.settingMin), getResources().getInteger(R.integer.settingMinDefaultValue));
            sharedPreferences.edit().putInt(getString(R.string.settingMax), getResources().getInteger(R.integer.settingMaxDefaultValue));

            sharedPreferences.edit().commit();

            updateUiWithSharedPrefData();

            Toast.makeText(getContext(), "Settings reset", Toast.LENGTH_SHORT).show();
        });

        updateUiWithSharedPrefData();

        return this.binding.getRoot();
    }


    private void updateUiWithSharedPrefData(){

        Log.d("SettingsFragment", "min / max : "   sharedPreferences.getInt(getString(R.string.settingMin), getResources().getInteger(R.integer.settingMinDefaultValue))   " / "   sharedPreferences.getInt(getString(R.string.settingMax), getResources().getInteger(R.integer.settingMaxDefaultValue)));

        List<Float> floats = new ArrayList<>();
        float min = (float) sharedPreferences.getInt(getString(R.string.settingMin), getResources().getInteger(R.integer.settingMinDefaultValue));
        float max = (float) sharedPreferences.getInt(getString(R.string.settingMax), getResources().getInteger(R.integer.settingMaxDefaultValue));

        floats.add(min);
        floats.add(max);

        binding.sliderMinMaxSetting.setValues(floats);

    }
}

Thanks for the answers. This is the solution:

sharedPreferences.edit()
                        .putInt(getString(R.string.settingMin), Math.round(slider.getValues().get(0)))
                        .putInt(getString(R.string.settingMax), Math.round(slider.getValues().get(1)))
                        .commit();

CodePudding user response:

You should commit right after editing:

sharedPreferences.edit()
    .putInt(PREF_KEY, PREF_VALUE)
    .commit();

Also take into account the edits can be concatenated, so your code would look like this:

sharedPreferences.edit()
    .putInt(getString(R.string.settingMin), getResources().getInteger(R.integer.settingMinDefaultValue))
    .putInt(getString(R.string.settingMax), getResources().getInteger(R.integer.settingMaxDefaultValue))
    .commit();

CodePudding user response:

Replace your SharedPreferences initialization with this:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());

  •  Tags:  
  • Related