Android阻止AlertDialog自动关闭

Android开发中,AlertDialog使用相当频繁,基本是必须使用的

它的使用方法非常简单:

alertDialog = newAlertDialog.Builder(mContext)
    .setTitle("提示")
    .setMessage("你确定要删除该附件吗?")
    .setPositiveButton("删除", newDialogInterface.OnClickListener() {
        @Override
        public voidonClick(DialogInterface dialog, int which) {
            //点击确定按钮之后的代码...
        }
    })
    .setNegativeButton("取消", newDialogInterface.OnClickListener() {
        @Override
        public voidonClick(DialogInterface dialog, int which) {
            //点击取消按钮之后的代码...
        }
    })
    .create();
alertDialog.setCanceledOnTouchOutside(false);
alertDialog.show();

可以发现AlertDialog默认不管点击确定还是取消都会dismiss的

如何实现AlertDialog点击确定按钮不会dismiss呢,使用反射机制,代码如下:

    alertDialog = new AlertDialog.Builder(mContext)
        .setTitle("提示")
        .setMessage("你确定要删除该附件吗?")
        .setPositiveButton("删除", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                preventDismissDialog();
                //添加删除请求代码...
                ......
                alertDialog.setMessage("正在删除附件,请稍后...");
            }
        })
        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dismissDialog();
            }
        })
        .create();
    alertDialog.setCanceledOnTouchOutside(false);
    alertDialog.show();

/**
 * 关闭对话框
 */
private void dismissDialog() {
    try {
        Field field = alertDialog.getClass().getSuperclass().getDeclaredField("mShowing");
        field.setAccessible(true);
        field.set(alertDialog, true);
    } catch (Exception e) {
    }
    alertDialog.dismiss();
}

/**
 * 通过反射 阻止关闭对话框
 */
private void preventDismissDialog() {
    try {
        Field field = alertDialog.getClass().getSuperclass().getDeclaredField("mShowing");
        field.setAccessible(true);
        //设置mShowing值,欺骗android系统
        field.set(alertDialog, false);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
上一篇 Android 拨打电话(跳转拨打及直接拨通)
下一篇 PHP获取今天、昨天、明天的日期
目录
文章列表
1 CentOS添加删除用户和用户组
CentOS添加删除用户和用户组
2
Vue刷新当前页面或组件
Vue刷新当前页面或组件
3
CentOS下以二进制方式安装 MySQL 8
CentOS下以二进制方式安装 MySQL 8
4
免费开源后台管理系统模板
免费开源后台管理系统模板
5
Spring Security OAuth2 token存储Redis用户登出logOut
Spring Security OAuth2 token存储Redis用户登出logOut
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。