Search code examples
javaandroidandroid-preferences

want only one SwitchPreferenceCompat to be true in the whole category


Maybe this is a silly thing I'm asking in the forum. I'm new to programming and I tried searching a lot for the help online but no luck. Spare me if it's a very silly issue I'm asking now.

I have a few SwitchPreferenceCompat elements set up into a Preference Category in the settings fragment. The functionality I'm trying to achieve is when the user sets one of the switches in that category to true, all the other switches has to be off(i.e. false).

and when the user sets another switch to true in the same category, the earlier switch has to be set to false automatically with the generic switch toggle transition. So, there has to be only one switch toggled true in the entire Preference Category at any point in time.

So, to obtain this functionality, I've tried setting a switch-case in the onSharedPreferenceChanged() method like this:

        @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        Preference preference = findPreference(key);

        if (preference != null){

            if (preference instanceof SwitchPreferenceCompat){
                Log.d(TAG,"Key : " + preference.getKey() + " / value : " + ((SwitchPreferenceCompat) preference).isChecked());

                SwitchPreferenceCompat preferenceCompat = (SwitchPreferenceCompat) preference;


                SharedPreferences.Editor pref_Editor = sharedPreferences.edit();


                switch (preferenceCompat.getKey()){

                    case "retrofit_sync":
                        preference.setSelectable(true);
//                        ((findPreference("volley"))).setSelectable(true);
                        ((SwitchPreferenceCompat) (findPreference("retrofit_sync"))).setChecked(true);
                        ((SwitchPreferenceCompat) (findPreference("volley"))).setChecked(false);
                        ((SwitchPreferenceCompat) (findPreference("Async_task_Key"))).setChecked(false);
                        ((SwitchPreferenceCompat) (findPreference("async_task_loader_key"))).setChecked(false);
                        pref_Editor.apply();
                        break;

                    case "volley":

                        ((SwitchPreferenceCompat) (findPreference("volley"))).setChecked(true);
                            ((SwitchPreferenceCompat) (findPreference("retrofit_sync"))).setChecked(false);
                            ((SwitchPreferenceCompat) (findPreference("Async_task_Key"))).setChecked(false);
                            ((SwitchPreferenceCompat) (findPreference("async_task_loader_key"))).setChecked(false);
                        pref_Editor.apply();
                        break;

                    case "Async_task_Key":

                        ((SwitchPreferenceCompat) (findPreference("Async_task_Key"))).setChecked(true);
                        ((SwitchPreferenceCompat) (findPreference("retrofit_sync"))).setChecked(false);
                        ((SwitchPreferenceCompat) (findPreference("volley"))).setChecked(false);
                        ((SwitchPreferenceCompat) (findPreference("async_task_loader_key"))).setChecked(false);

                        pref_Editor.apply();
                        break;

                    case "async_task_loader_key":

                        ((SwitchPreferenceCompat) (findPreference("async_task_loader_key"))).setChecked(true);
                        ((SwitchPreferenceCompat) (findPreference("retrofit_sync"))).setChecked(false);
                        ((SwitchPreferenceCompat) (findPreference("volley"))).setChecked(false);
                        ((SwitchPreferenceCompat) (findPreference("Async_task_Key"))).setChecked(false);

                        pref_Editor.apply();
                        break;
                }

            }

        }

    }

But, the problem is that the code doesn't work as expected. When the user taps on some other preference object(not on the toggle switch), the code is toggling active the switch to false. But it's not toggling the newly tapped switch to true.

Can anyone please help me with this problem.

Thank you.


Solution

  • It's not intuitive to use a series of SwitchPreferenceCompats out of which only one can be set true. However, in any case, if you want to do so, do this in the onCreate:

    SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
            Preference preference = findPreference(s);
            if (s.equals("key1") { 
                findPreference("key2").setChecked(false);
                ...
                findPreference("key5").setChecked(false);
            } ... else if (s.equals("key5") { ... 
            } else { //do whatever you want for other Preferences }
    

    This is the generic idea. It works for me.