DialogFragment调用setCancelable(false)不生效问题求助
问题原因及解决方案
核心原因
你在代码中仅对AlertDialog.Builder配置了setCancelable(false),该配置仅作用于构建出的AlertDialog对象,而DialogFragment本身自带取消行为控制逻辑,优先级高于Dialog自身的配置,因此单独给AlertDialog设置不生效。
正确修改方案
你需要同时做两处调整:
- 给DialogFragment自身调用
setCancelable(false),禁用DialogFragment的取消行为 - 给最终生成的AlertDialog调用
setCanceledOnTouchOutside(false),禁止点击对话框外部区域触发取消
修改后的代码如下:
public static class UsageAcessDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // 给DialogFragment本身设置不可取消 this.setCancelable(false); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Grant Usage Access permission") .setTitle("Usage Access Permission") .setPositiveButton("Allow", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { startActivityForResult( new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS); } }); AlertDialog dialog = builder.create(); // 禁止点击外部区域取消 dialog.setCanceledOnTouchOutside(false); return dialog; } }
你也可以选择在实例化DialogFragment的位置配置,效果一致:
UsageAcessDialogFragment fragment = new UsageAcessDialogFragment(); fragment.setCancelable(false); fragment.show(getSupportFragmentManager(), "usage_access_tag");
内容的提问来源于stack exchange,提问作者Jin Appsdev
相关产品推荐
相关产品推荐

