Android设置AlertDialog点击按钮对话框不关闭(转)

(转自:http://blog.csdn.net/winson_jason/article/details/8485524)

当我们在用到Android alertDialog创建对话框 的时候,我们会遇到一个问题就是:我们添加的按钮不论是用setNegativeButton还是用setPositiveButton添加的按钮,点击的时候,都会关闭对话框,但是我们的一 些实际需求,就需要保留这个对话框不动,例如输入校验码,密码之类的校验问题,如果用户输入错误,而关闭后弹出对话框,就很别扭了。

        在网上找了一下,原来在源码中有一个boolean变量是控件对话框的关闭与否的mShowing变量,我们只需要利用反射改变这个变量就可以控制我们的对话框是不是关闭了。所以,我们可以通过手动设置mShowing的值来达到目的。

 1      try {
 2     
 3      Field field =
 4      dialog.getClass().getSuperclass().getDeclaredField("mShowing");
 5     
 6      field.setAccessible(true);
 7     
 8      field.set(dialog, false);//true表示要关闭,false不关闭
 9     
10      } catch (Exception e) {
11     
12      e.printStackTrace();
13     
14      }
15     

具体代码:

 1     
 2     
 3     
 4      new AlertDialog.Builder(Bookstore.getInstance())
 5     
 6      .setTitle(r.getString(“提示”)
 7     
 8      .setMessage(“不能打开”)
 9     
10      .setPositiveButton(“确定”), new DialogInterface.OnClickListener() {
11     
12      public void onClick(DialogInterface dialog, int which) {
13     
14      try {//下面三句控制弹框的关闭
15     
16      Field field =
17      dialog.getClass().getSuperclass().getDeclaredField("mShowing");
18     
19      field.setAccessible(true);
20     
21      field.set(dialog,true);//true表示要关闭
22     
23      } catch (Exception e) {
24     
25      e.printStackTrace();
26     
27      }
28     
29     
30      }
31     
32      }).show();

本人参考后补充:

若在定义Field提示出错时可改为:

java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");

一旦设置了不关闭DIALOG,点取消也不会关闭,所以需在取消事件下设置为可关闭:

 1 ...
 2 
 3 new AlertDialog.Builder(this)
 4 .setTitle(titleId)
 5 .setView(layout)
 6 .setPositiveButton(android.R.string.ok,
 7 new DialogInterface.OnClickListener() {
 8 public void onClick(DialogInterface dialog,
 9 int which) {
10 
11 //点确定按钮
12 
13 }
14 }).setNegativeButton(android.R.string.cancel, 
15 new DialogInterface.OnClickListener() {
16 
17 //点取消按钮
18 public void onClick(DialogInterface dialog,
19 int which) {    
20 try {//下面三句控制弹框的关闭
21 java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
22 field.setAccessible(true);
23 field.set(dialog,true);//true表示要关闭
24 
25 } catch (Exception e) {
26 e.printStackTrace();
27 }    
28 }
29 
30 })
31 //null)
32 .create().show();
33 }
原文地址:https://www.cnblogs.com/jenson138/p/4108129.html