希望整个类别中只有一个 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 }
这是通用的想法。它对我有用。
也许这是我在论坛上问的一个愚蠢的问题。我是编程新手,我尝试在网上搜索很多帮助,但没有成功。如果我现在问的是一个非常愚蠢的问题,请饶了我吧。
我在设置片段中将一些 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 }
这是通用的想法。它对我有用。