AlertDialog.Builder 设置点击不关闭弹框

本文介绍如何通过反射修改AlertDialog.Builder的mShowing字段,实现点击自定义按钮时不关闭对话框,适用于Android开发中特定需求的对话框定制。

当我们在用到AlertDialog.Builder创建对话框的时候,我们会遇到一个问题就是:我们添加的按钮不论是用setNegativeButton还是用setPositiveButton添加的按钮,点击的时候,都会关闭对话框,但我们的一些实际需求,就需要保留这个对话框。

在源码中有一个boolean变量是控件对话框的关闭与否的mShowing变量,我们只需要利用反射改变这个变量就可以控制我们的对话框是不是关闭。

可以通过手动设置mShowing的值可以通过手动设置mShowing的值。

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                builder.setTitle("标题");
                builder.setView(view);
                builder.setIcon(R.mipmap.ic_applogorec); //设置图标
                builder.setCancelable(false);
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        try {
                            Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                            field.setAccessible(true);
                            if(true){
                                field.set(dialog, true);//true表示要关闭
                            } else{
                                field.set(dialog, false);//false不关闭
                            } 
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                builder.setNegativeButton("关闭", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //一旦上面设置了不关闭DIALOG,点取消也不会关闭,所以需在取消事件下设置为可关闭
                        try {
                            Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                            field.setAccessible(true);
                            field.set(dialog, true);//true表示要关闭
                        } catch (Exception e){
                            e.printStackTrace();
                        }
                        dialog.cancel();
                    }
                });
                AlertDialog alertDialog = builder.create();
                alertDialog.show();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DSJ_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值