Androidx中ListPreference无法调用getDialog()方法问题求助
解决AndroidX中ListPreference无法调用getDialog()的问题
AndroidX重构了Preference库,原来的getDialog()方法从ListPreference中移除了,直接调用就会报错。给你几个实用的解决办法:
方法一:提前拦截点击,避免空对话框弹出
这是最推荐的方案,在用户点击Preference时先检查权限,没权限就直接拦截点击,不让对话框弹出来:
coustomListPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { if (!XXXXPermissionGranted()) { // 提示用户需要权限 Toast.makeText(getContext(), "得先授予相关权限才能用这个设置哦", Toast.LENGTH_SHORT).show(); // 返回true表示拦截本次点击,对话框不会弹出 return true; } // 权限没问题,让系统正常处理点击,弹出对话框 return false; } });
方法二:通过反射获取Dialog(临时应急方案)
如果某些场景下对话框还是会弹出,又必须关闭,可以用反射拿到内部的Dialog对象,不过这种方式不推荐长期用,因为后续库更新可能会改字段名:
if (!XXXXPermissionGranted()) { try { // 反射获取ListPreference内部的mDialog字段 Field dialogField = ListPreference.class.getDeclaredField("mDialog"); dialogField.setAccessible(true); Dialog dialog = (Dialog) dialogField.get(coustomListPreference); if (dialog != null && dialog.isShowing()) { dialog.dismiss(); } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } }
方法三:自定义ListPreference,从源头控制对话框
更规范的做法是自定义ListPreference,重写对话框准备的方法,在权限不足时调整对话框内容或者直接不显示:
public class CustomListPreference extends ListPreference { public CustomListPreference(Context context) { super(context); } public CustomListPreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { if (!XXXXPermissionGranted()) { // 权限不足时,设置提示信息,去掉可选列表 builder.setMessage("需要相关权限才能进行选择"); // 移除确认按钮,避免用户无意义操作 builder.setPositiveButton(null, null); } else { // 权限正常,调用父类方法显示正常的列表对话框 super.onPrepareDialogBuilder(builder); } } }
之后在xml布局里用你自定义的CustomListPreference替代原来的ListPreference即可。
内容的提问来源于stack exchange,提问作者Fisher
相关产品推荐
相关产品推荐

