`

如何在不同条件下选择性地关闭dialog .

 
阅读更多

转自:http://blog.csdn.net/mvpsendoh/article/details/6649279

 

最近在做个小项目,其中有涉及到dialog的按钮的事件处理,情形是这样的:

在按钮的监听器中,我希望做一个if else 判断,如果条件符合,就关闭对话框,如果条件不符合,就不关闭对话框,并做其他处理。

首先,默认情况下,按下dialog按钮就会将对话框关闭。如果我们需要维持对话框,就不能让它关闭了。比如我们要使用对话框弹出一个目录,希望点击对话框的按钮时返回上层目录。这时如果咔嚓一声,它就把我们的对话框给关了,这就不好了。如何使它不关闭呢?

请看下面代码:

  1. builder.setPositiveButton("返回"new DialogInterface.OnClickListener() {  
  2.      
  3.    public void onClick(DialogInterface dialog, int which) {  
  4.       try {  
  5.          field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");  
  6.          field.setAccessible(true);  
  7.          field.set(dialog,false);  
  8.          dialog.dismiss();  
  9.       } catch (SecurityException e) {  
  10.       // TODO Auto-generated catch block   
  11.       e.printStackTrace();  
  12.      } catch (NoSuchFieldException e) {  
  13.       // TODO Auto-generated catch block   
  14.       e.printStackTrace();  
  15.      } catch (IllegalArgumentException e) {  
  16.       // TODO Auto-generated catch block   
  17.       e.printStackTrace();  
  18.      } catch (IllegalAccessException e) {  
  19.       // TODO Auto-generated catch block   
  20.       e.printStackTrace();  
  21.      }  
  22.   
  23.     //做其他处理   
  24.   });  
  25.         
  26.   builder.show();  


按照上面的try{}语句中那样设置,就不会在按下按钮时关闭对话框了。那如果我们想要先做个条件判断后,再决定是否要关闭对话框呢?

大家第一时间应该会想:这还不简单吗?加个if else不就得了!如下:

  1. builder.setPositiveButton("返回"new DialogInterface.OnClickListener() {  
  2.      
  3.    public void onClick(DialogInterface dialog, int which) {  
  4.     if(!condition){  
  5.      try {  
  6.       field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");  
  7.       field.setAccessible(true);  
  8.       field.set(dialog,false);  
  9.       dialog.dismiss();  
  10.      } catch (SecurityException e) {  
  11.       // TODO Auto-generated catch block   
  12.       e.printStackTrace();  
  13.      } catch (NoSuchFieldException e) {  
  14.       // TODO Auto-generated catch block   
  15.       e.printStackTrace();  
  16.      } catch (IllegalArgumentException e) {  
  17.       // TODO Auto-generated catch block   
  18.       e.printStackTrace();  
  19.      } catch (IllegalAccessException e) {  
  20.       // TODO Auto-generated catch block   
  21.       e.printStackTrace();  
  22.      }  
  23.   
  24.    }  
  25.     else {  
  26.           dialog.dismiss();  
  27.      }       
  28.    }  
  29.   });  


不过遗憾的是,这样写虽然简单,但是却不起作用。这样设置了以后,是存在的不稳定因素的。

为什么呢?因为按下dialog会不会被关闭,我们可以把它当做dialog的一个属性。我们在之前为了使按下按钮不关闭dialog,我们改变了它默认的属性,正是通过下面的代码:

field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");

field.setAccessible(true);

field.set(dialog,false);

此时dialog的属性已经改变了。如果第一次条件判断成功,dialog属性被修改了。而第二次条件判断不成功,执行else语句,此时dialog的属性已经在第一次条件判断中被设置为按下按钮不关闭。那么此时无论你调用多少次dialog的dismiss方法,他也不会把对话框关掉了。

那么怎么办呢?简单,把他的属性改回来就行了:

  1. builder.setPositiveButton("返回"new DialogInterface.OnClickListener() {  
  2.      
  3.    public void onClick(DialogInterface dialog, int which) {  
  4.     if(!condition){  
  5.      try {  
  6.       field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");  
  7.       field.setAccessible(true);  
  8.       field.set(dialog,false);  
  9.       dialog.dismiss();  
  10.      } catch (SecurityException e) {  
  11.       // TODO Auto-generated catch block   
  12.       e.printStackTrace();  
  13.      } catch (NoSuchFieldException e) {  
  14.       // TODO Auto-generated catch block   
  15.       e.printStackTrace();  
  16.      } catch (IllegalArgumentException e) {  
  17.       // TODO Auto-generated catch block   
  18.       e.printStackTrace();  
  19.      } catch (IllegalAccessException e) {  
  20.       // TODO Auto-generated catch block   
  21.       e.printStackTrace();  
  22.      }  
  23.     }  
  24.     else {  
  25.     try {  
  26.       field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");  
  27.       field.setAccessible(true);  
  28.       field.set(dialog,true);  
  29.       dialog.dismiss();  
  30.      } catch (SecurityException e) {  
  31.       // TODO Auto-generated catch block   
  32.       e.printStackTrace();  
  33.      } catch (NoSuchFieldException e) {  
  34.       // TODO Auto-generated catch block   
  35.       e.printStackTrace();  
  36.      } catch (IllegalArgumentException e) {  
  37.       // TODO Auto-generated catch block   
  38.       e.printStackTrace();  
  39.      } catch (IllegalAccessException e) {  
  40.       // TODO Auto-generated catch block   
  41.       e.printStackTrace();  
  42.      }      
  43.     }  
  44.    }  
  45.   });  


这样,在else中将dialog的属性改回来,这样就OK啦!

分享到:
评论

相关推荐

    VB.close.dialog.run.program.name.hide.rar_hide

    "VB.close.dialog.run.program.name.hide"这个主题恰好关注的就是这样一个技术点:如何在关闭对话框时隐藏运行程序的名称。 首先,让我们了解VB中的对话框。对话框是应用程序与用户交互的一种方式,它们通常用于...

    dialog弹出样式

    因此,在选择动画效果时,应考虑到设备的性能和内存限制,确保对话框的流畅性。 总的来说,“dialog弹出样式”是Android应用中提升用户体验的重要一环。通过NiftyDialogEffects,开发者可以轻松实现多种对话框动画...

    Android 自定义Dialog

    dialog.show(); ``` 3. **使用DialogFragment** 如果选择使用`DialogFragment`,我们需要创建一个继承自`DialogFragment`的新类,并重写`onCreateDialog`方法。在这个方法中,我们将加载布局并构建Dialog: ```...

    Dialog滑动动画

    在实际应用中,你可能还需要处理一些边界情况,例如防止Dialog在滑动动画过程中被用户误触关闭。此外,还可以通过调整动画时长、滑动阈值等参数来优化用户体验。 总的来说,通过自定义AlertDialog的布局和添加滑动...

    jquery弹出框插件jquery.ui.dialog用法分析

    例如,thinkbox通常在`$.ready`中初始化,限制了弹出时机的多样性,而Dialog的API允许动态创建和控制对话框,可以根据业务逻辑条件灵活决定是否显示。 7. **实战示例** 以下是一个基本的Dialog实例,展示了如何在...

    Dialog 测试-----------

    1. **显示与隐藏**:测试`Dialog`是否能在正确的时间和条件下显示,并在适当的时候自动或手动关闭。 2. **交互性**:确保用户能够通过点击按钮或执行其他操作与`Dialog`进行交互,且这些交互能触发预期的响应。 3....

    android自定义的可扩展漂亮的dialog对话框

    10. **条件筛选**:对于条件筛选功能,可以在Dialog中添加可选的条件选项,用户选择后,将结果传递回主界面进行处理。 11. **消息提示**:简单消息提示通常只包含一条信息和一个确认按钮。自定义Dialog可以提供更...

    dialogDemo

    在实际开发过程中,不断测试对话系统的功能,确保其在不同场景下正常工作。利用Unity的Profiler工具检查性能,优化代码以减少内存占用和CPU负载。 通过"dialogDemo"项目,你将学习到如何结合Unity的UI系统和C#编程...

    eclipse插件编程之action和dialog

    Dialog在GUI应用中是一个临时的窗口,用于与用户进行更复杂的交互,如输入信息、选择选项等。在Eclipse插件中,我们可以使用`org.eclipse.jface.dialogs.Dialog`类作为基础,创建自定义的对话框。Dialog通常包含标题...

    一行代码实现Dialog展示引导页

    Dialog是Android UI设计中常见的一种组件,通常用于显示临时性的信息或者需要用户进行简单交互的情况。而引导页则常用于初次使用应用时,向用户介绍应用的主要功能或特色,帮助他们快速上手。 Dialog展示引导页的...

    Dialog弹出窗口全齐代码

    在IT行业中,对话框(Dialog)是用户界面中不可或缺的一部分,它用于向用户显示临时信息、请求输入或者执行特定操作。"Dialog弹出窗口全齐代码"是一个专注于创建具有腾讯风格的弹出层效果的代码资源,兼容主流浏览器...

    各种dialog

    在IT行业中,对话框(Dialog)是用户界面设计中的一个重要元素,它用于向用户显示临时信息,接收用户输入,或进行一系列操作确认。本合集包含多种样式的对话框,如仿苹果样式、全屏样式以及界面底部组选样式,这些都...

    jquery 模态窗口

    7. **自动打开和关闭**:可以设置Dialog在页面加载后自动打开,或者在特定条件下自动关闭: ```javascript $("#dialog").dialog({ autoOpen: true, closeOnEscape: true, // 按Esc键关闭 open: function() { ...

    多弹出框的屏蔽

    - **线程安全**:如果在多线程环境下操作Dialog,要确保代码的线程安全性,防止竞态条件。 - **适配不同设备**:考虑到不同设备的屏幕尺寸和分辨率,Dialog的设计应具备良好的响应性和适配性。 总的来说,"多Dialog...

    autoplay media 6 action脚本

    - **Dialog.FileBrowse()**:打开文件浏览对话框,允许用户选择打开或保存文件,可自定义标题、默认文件夹、过滤条件、多选与否等参数。 - **Dialog.FolderBrowse()**:显示文件夹浏览对话框,让用户选择一个文件夹...

    dg.rar_Dialogue

    用户可能在打印过程中有选择性地开启清除对话和自动关机功能。例如,如果用户设置了自动关机,那么在打印作业完成后,电脑会按照预设的时间自动关闭;同时,如果选择了清除对话,那么在打印对话框出现并开始打印后,...

    一个基于easyui的多人选择插件

    在多人选择的情境下,dialog提供了一个集中且不干扰主页面其他元素的环境,让用户专注进行选择。 这个插件可能包含以下关键特性: 1. **多选机制**:通过复选框或者选择框让用户可以同时选择多个选项。 2. **搜索...

    EasyUI for JQuery官方文档.pdf

    例如,对话框组件(dialog)的默认属性定义在了jQuery.fn.dialog.defaults中。这些属性允许开发者定制组件的外观和功能,比如改变对话框的大小、位置或者行为等。 除了属性,EasyUI组件还拥有方法和事件。组件的...

    Android智能手机操作系统下的层级过渡浅析.rar

    - 考虑兼容性:虽然层级过渡在Android 5.0后才被广泛支持,但可以通过支持库或条件判断来适配更低版本的系统。 总的来说,Android层级过渡是提升应用交互体验的重要工具。通过深入理解和熟练运用,开发者可以创造出...

    简易图书管理系统【精选文档】.doc

    - 点击“查询”按钮,`searchdialog.java`会打开搜索界面,用户输入查询条件,搜索结果在主界面的表格中显示。 - 若选择“删除”,系统会确认用户是否要删除选中的图书,然后调用`dbcon.java`的`delete()`方法执行...

Global site tag (gtag.js) - Google Analytics