Android 阻止AlertDialog dismiss

  builder.setPositiveButton("确定",(dialog,which)->{
        String statisticExcelNamEditText = editText.getText().toString().trim();
        if(TextUtils.isEmpty(statisticExcelNamEditText)){
            ToastUtils.show("请输入Excel文件名!");
        }else{
            String  statisticFilePath =  Constant.EXCEL_FOLDER_PATH +statisticExcelNamEditText +".xls";
            outputExcel(statisticInfo,statisticFilePath);
            dialog.dismiss();
        }
    });
    builder.setNegativeButton("取消",(dialog,which)->{
        dialog.dismiss();
    });
    AlertDialog alertDialog = builder.create();
    setAlertDialogManualDissMiss(alertDialog);// 阻止点击button时dissmis,需手动dissMiss
    alertDialog.show();
}

/**
 * 设置AlertDialog 手动dismiss
 * 通过重新设置一个button处理类,达到点击确定按钮不dismiss掉dialog的效果
 * @param dialog alertDialog
 */
private void setAlertDialogManualDissMiss(DialogInterface dialog) {
    try {
        Field field=null;
        //通过反射获取dialog中的私有属性mShowing
        if(! (dialog instanceof AlertDialog)){
          return;
        }
        field=   ((AlertDialog)dialog).getClass().getDeclaredField("mAlert");
        //Field field = dialog.getClass().getDeclaredField("mAlert");
        field.setAccessible(true);
        /* 获得mAlert变量的值 */
        Object obj = field.get(dialog);
        field = obj.getClass().getDeclaredField("mHandler");
        field.setAccessible(true);
        /* 修改mHandler变量的值,使用新的ButtonHandler类 */
        field.set(obj, new Handler());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

// 阻止dissmis 不起作用(可能是v7包的,本身包的没试)
private void setAlertDialogCanDissmiss(DialogInterface dialog, boolean canDissmiss){
    Field field = null;
    try {
        //通过反射获取dialog中的私有属性mShowing
        if(dialog instanceof AlertDialog){//v7包中的是父类 的父类
            //要看清Dialog是他的父类还是父类的父类(即看清是哪个包的)
            field = ((AlertDialog)dialog).getClass().getSuperclass().getSuperclass().getDeclaredField("mShowing");
        }
        field.setAccessible(true);//设置该属性可以访问
        field.set(dialog, canDissmiss);//false can,true not can
        // dialog.dismiss();
    } catch (Exception ex) {
        ex.printStackTrace();
        System.out.println("--->ex" +ex.getMessage());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值