【问题标题】:want only one SwitchPreferenceCompat to be true in the whole category只希望一个 SwitchPreferenceCompat 在整个类别中为真
【发布时间】:2020-10-23 21:57:36
【问题描述】:

也许这是我在论坛上问的一个愚蠢的事情。我是编程新手,我尝试在网上搜索很多帮助,但没有运气。如果我现在问的是一个非常愚蠢的问题,请原谅我。

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

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

因此,为了获得此功能,我尝试在 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。

谁能帮我解决这个问题。

谢谢。

【问题讨论】:

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

标签: java android android-preferences


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2011-06-07
    相关资源
    最近更新 更多