希望整个类别中只有一个 SwitchPreferenceCompat 为真

want only one SwitchPreferenceCompat to be true in the whole category

也许这是我在论坛上问的一个愚蠢的问题。我是编程新手,我尝试在网上搜索很多帮助,但没有成功。如果我现在问的是一个非常愚蠢的问题,请饶了我吧。

我在设置片段中将一些 SwitchPreferenceCompat 元素设置到首选项类别中。我试图实现的功能是当用户将该类别中的一个开关设置为 true 时,所有其他开关都必须关闭(即 false)。

并且当用户将同一类别中的另一个开关设置为 true 时,必须使用通用开关切换转换将较早的开关自动设置为 false。因此,在任何时间点,整个偏好类别中必须只有一个开关切换为真。

因此,为了获得此功能,我尝试在 onSharedPreferenceChanged() 方法中设置一个 switch-case,如下所示:

        @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;
                }

            }

        }

    }

但是,问题是代码没有按预期工作。当用户点击某个其他首选项对象(而不是切换开关)时,代码会将开关切换为 false。但它并没有将新点击的开关切换到 true。

谁能帮我解决这个问题。

谢谢。

使用一系列 SwitchPreferenceCompat 是不直观的,其中只有一个可以设置为真。但是,无论如何,如果您想这样做,请在 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 }

这是通用的想法。它对我有用。