【发布时间】: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