You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:24:04