AlertDialog通过反射机制阻止Dialog关闭

在开发Android应用程序时,我们可能会用到需要用户输入的Dialog,如登录对话框等。这时候,如果用户没有输入登录信息而点击<确定>按钮时,我们并不希望登录Dialog消失,而是采用一个Toast提示用户没有输入登录信息。在这里,我就向大家介绍下Dialog通过反射机制阻止Dialog关闭。

在我们创建Dialog时,在Dialog的按钮点击事件处理中做如下处理

[java] view plaincopy
  1. <pre name="code" class="java"><pre name="code" class="java">LayoutInflater inflater = LayoutInflater.from(this);  
  2. final View textEntryView = inflater.inflate(  
  3.         R.layout.f_alert_dialog_takeeffect, null);  
  4. AlertDialog.Builder builder = new AlertDialog.Builder(context);  
  5.         builder.setIcon(android.R.drawable.ic_dialog_alert);  
  6.         builder.setView(textEntryView);  
  7.         builder.setTitle(profileSettingList[settingId]);  
  8.         //确定按钮点击事件处理  
  9.         builder.setPositiveButton(R.string.btn_OK,  
  10.                 new DialogInterface.OnClickListener() {  
  11.                 public void onClick(DialogInterface dialog, int whichButton) {  
  12.                         Field field = null;  
  13.                         try {  
  14.                             //通过反射获取dialog中的私有属性mShowing  
  15.                             field = dialog.getClass().getSuperclass()  
  16.                                     .getDeclaredField("mShowing");  
  17.                             field.setAccessible(true);//设置该属性可以访问  
  18.                         } catch (Exception e) {  
  19.                               
  20.                         }  
  21.                         EditText message_edit = (EditText) textEntryView  
  22.                                 .findViewById(R.id.usermessage_edit);  
  23.                         String message = String.valueOf(message_edit.getText());  
  24.                         if (null == message || "".equals(message)) {  
  25.                             try {  
  26.                                 //输入框中内容为空,dialog不关闭  
  27.                                 field.set(dialog, false);  
  28.                                 dialog.dismiss();  
  29.                             } catch (Exception e) {  
  30.                             }  
  31.                             //提示用户输入登录信息  
  32.                             Toast.makeText(getApplicationContext(),  
  33.                                         R.string.pleaseenter_message,  
  34.                                         Toast.LENGTH_LONG).show();  
  35.                         } else {  
  36.                             try {  
  37.                                 //可以关闭  
  38.                                 field.set(dialog, true);  
  39.                                 dialog.dismiss();  
  40.                             } catch (Exception e) {  
  41.                             }  
  42.                             //登录业务处理</pre><br>  
  43. <br>  
  44. <pre></pre>  
  45. <pre></pre>  
  46. <p></p>  
  47. <p></p>  
  48. <pre></pre>  
  49. <pre></pre>  
  50. <pre></pre>  
  51. <pre></pre>  
  52. <pre></pre>  
  53. <pre></pre>  
  54. <pre></pre>  
  55.   
  56. </pre>  
原文地址:https://www.cnblogs.com/lanzhi/p/6469719.html