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

Java 希望整个类别中只有一个SwitchPreferenceCompat为真,java,android,android-preferences,Java,Android,Android Preferences,也许这是我在论坛上问的一个愚蠢的问题。我是编程新手,我试着在网上搜索了很多帮助,但没有成功。如果我现在问的是一个非常愚蠢的问题,那就饶了我吧 我在设置片段中将一些SwitchPreferenceCompat元素设置为首选项类别。我试图实现的功能是,当用户将该类别中的一个开关设置为true时,所有其他开关都必须关闭(即false) 当用户在同一类别中将另一个开关设置为true时,必须使用通用开关切换转换将较早的开关自动设置为false。因此,在任何时间点,在整个首选项类别中只有一个开关切换为tru

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

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

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

因此,为了获得此功能,我尝试在onSharedPreferenceChanged()方法中设置开关大小写,如下所示:

        @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。但它并没有将新点击的开关切换为真

谁能帮我解决这个问题


谢谢。

使用一系列的
开关首选项compat
是不直观的,其中只有一个可以设置为true。但是,在任何情况下,如果要执行此操作,请在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 }

这是一般的想法。这对我很有用。

对于项目列表,您应该使用
ListPreference
谢谢您的帮助@Md.Asaduzzaman:)。除了使用ListPreference,没有其他选择。因为我只想用那个拨动开关:D:D。