• 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>  
  • 相关阅读:
    c++学习--面向对象一实验
    c++学习--面向对象一
    c#学习
    Linux安全之SSH 密钥创建及密钥登录,禁止密码登陆
    laravel 5.5 跨域问题 并且laravel的跨域 Access-Control-Allow-Origin 报错的坑
    安装 lnmp
    微信小程序-聊天功能下拉加载更多数据(历史聊天内容出现在顶部)
    简单实现小程序view拖拽功能
    mysql 常用命令
    有感而发——写给曼曼的信
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469719.html
Copyright © 2020-2023  润新知