如何为MultiSelectListPreference的单个选项重写onPreferenceChange?
问题描述
我正在修改他人编写的代码,该代码使用XML定义了MultiSelectListPreference(我原本会用代码实现),代码如下:
<MultiSelectListPreference android:key="action_out_of_range_list" android:title="@string/out_of_range_action" android:summary="@string/out_of_range_action_summary" android:entries="@array/button_actions" android:entryValues="@array/button_actions_values" android:defaultValue="@array/empty_array"/>
其中数组定义在strings.xml中。列表中的某一选项需要定位权限,因此当用户选择该选项时,应用应检查是否拥有该权限,若没有则引导用户前往设置。目前代码未实现此功能,我希望添加该逻辑,但只想为这个MultiSelectListPreference中的单个选项处理权限校验,而非重写整个偏好的逻辑。
我了解如何在顶层为偏好设置监听,现有代码示例如下:
findPreference(Preferences.RINGTONE + "_" + Preferences.Source.connected).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { presenter.onRingStone(Preferences.Source.connected.ordinal()); return true; } });
但未找到针对MultiSelectListPreference单个选项做权限校验的相关方法,想知道有没有无需推翻原有XML定义、不用全量改用代码实现偏好的解决方案?
解决方案
不用重构原有XML定义的偏好逻辑,直接给目标MultiSelectListPreference设置OnPreferenceChangeListener,在回调中针对特定选项做权限校验即可,具体步骤如下:
- 获取目标偏好实例
通过XML中定义的key找到对应的MultiSelectListPreference:
MultiSelectListPreference outOfRangePref = findPreference("action_out_of_range_list");
- 设置偏好变更监听
在回调中判断选中集合里是否包含需要权限的选项值,按需做权限检查:
outOfRangePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Set<String> selectedValues = (Set<String>) newValue; // 替换为你实际需要权限的选项对应的entryValue值(来自button_actions_values数组) String locationRequiredValue = "your_location_action_value"; // 若用户选中了需要权限的选项 if (selectedValues.contains(locationRequiredValue)) { // 检查定位权限(以ACCESS_FINE_LOCATION为例,按需替换权限类型) if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 引导用户前往应用设置页开启权限 Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri appUri = Uri.fromParts("package", requireContext().getPackageName(), null); settingsIntent.setData(appUri); startActivity(settingsIntent); // 返回false阻止当前选中状态保存,直到用户授予权限 return false; } } // 其他情况正常保存偏好设置 return true; } });
- 权限授予后的状态同步(可选)
如果希望用户从设置页返回后自动选中该选项,可以在页面onResume方法中补充逻辑:
@Override public void onResume() { super.onResume(); MultiSelectListPreference outOfRangePref = findPreference("action_out_of_range_list"); String locationRequiredValue = "your_location_action_value"; if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Set<String> currentSelected = outOfRangePref.getValues(); // 若未选中则添加并更新 if (!currentSelected.contains(locationRequiredValue)) { currentSelected.add(locationRequiredValue); outOfRangePref.setValues(currentSelected); } } }
内容的提问来源于stack exchange,提问作者Richard Parkins
相关产品推荐
相关产品推荐

