dialog.dismiss cancel和dialog.cancel有什么区别分别用在什么场合

4504人阅读
&&&&&& AlertDialog使用很方便,但是有一个问题就是:dismiss方法和cancel方法到底有什么不同?
&&&&&& 今天有时间,看了看源码(其实源码并不是全都那么深奥的!~~)。
&&&&&& AlertDialog继承与Dialog,现在各位看看结构图:
&&&&& 然后在Dialog类中找到了dismiss和cancel方法的实现。重要看dismiss的源码:
Java代码&&
public&void&cancel()&{&&
&&&&&&&if&(mCancelMessage&!=&null)&{&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&Message.obtain(mCancelMessage).sendToTarget();&&
&&&&&&&}&&
&&&&&&&dismiss();&&
&&& 看明白了吧! 在cancel方法中调用了dismiss方法。 但是现在还有一个问题就是:mCancelMessage是什么?
&&& private Message mCancelM // 这是源码中的声明
&&& 然后再来看源码:
Java代码&&
public&void&setOnCancelListener(final&OnCancelListener&listener)&{&&
&&&&&&&if&(listener&!=&null)&{&&
&&&&&&&&&&&mCancelMessage&=&mListenersHandler.obtainMessage(CANCEL,&listener);&&
&&&&&&&}&else&{&&
&&&&&&&&&&&mCancelMessage&=&null;&&
&&&&&&&}&&
ublic&void&setCancelMessage(final&Message&msg)&{&&
&&&&&&&mCancelMessage&=&&&
&& 现在问题清楚了,就是如果你在创建AlertDialog的时候调用了setOnCancelListener 这个mCancelMessage变量有作用,否则dismiss和cancel等同。 OK! 白白~~
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:153763次
积分:2172
积分:2172
排名:第9424名
原创:49篇
转载:123篇
评论:44条
(1)(1)(1)(13)(3)(48)(47)(9)(3)(2)(17)(28)当前访客身份:游客 [
当前位置:
我有一个dialog,是通过广播的方式弹出他的,但是调用activity的finish()方法之前已经调用了关闭dialog的方法了,但是还是会报 Activity com.avcit.conference.MainActivity has leaked window android.widget.PopupWindow$PopupViewContainer@406dfc10 that was originally added here
android.view.WindowLeaked: Activity com.avcit.conference.MainActivity has leaked window android.widget.PopupWindow$PopupViewContainer@406dfc10 that was originally added here
这个异常,但是要是通过一个按钮的来finish就没有问题!?求解
共有9个答案
<span class="a_vote_num" id="a_vote_num_
原因是activity 和dialog同时显示 要先dialog.dismiss() 后activity.finish()
<span class="a_vote_num" id="a_vote_num_
这个不是在dialog里调用的finish()吧。
建议重写dialog,接收外部intent通知后,dialog自己内部调用finish()。
<span class="a_vote_num" id="a_vote_num_
引用来自“北京d路飞”的答案 这个不是在dialog里调用的finish()吧。
建议重写dialog,接收外部intent通知后,dialog自己内部调用finish()。
是在dialog中有两个按钮,点击确认关闭dialog,同时finish掉这个activity,
<span class="a_vote_num" id="a_vote_num_
引用来自“正仔”的答案引用来自“北京d路飞”的答案 这个不是在dialog里调用的finish()吧。
建议重写dialog,接收外部intent通知后,dialog自己内部调用finish()。
是在dialog中有两个按钮,点击确认关闭dialog,同时finish掉这个activity,
点击了dialog的按钮后,dialog是会正常结束的。 你的是在dialog中finish弹出dialog的Activity吗? 如果是这个,就应该dialog里发消息给Activity,然后Activity自己destroy了。
<span class="a_vote_num" id="a_vote_num_
引用来自“北京d路飞”的答案 看下这个
原因是activity 和dialog同时显示 要先dialog.dismiss() 后activity.finish()
我在关闭activity前调用了 dialog的dismiss方法,但是是无效的,
因为我的这个dialog是通过广播打开的,在关闭时会出现那个异常,
但是在点击按钮调出这个dialog然后再关闭时是没有问题的!
<span class="a_vote_num" id="a_vote_num_
“因为我的这个dialog是通过广播打开的,在关闭时会出现那个异常, 但是在点击按钮调出这个dialog然后再关闭时是没有问题的!”
那可以在接收到广播后,sendMessage给Activity的Handler,在Activity所在的UI Thread里打开这个Dialog,这样效果应该是和点击按钮调出这个dialog一样的。
<span class="a_vote_num" id="a_vote_num_
哦,谢谢了
<span class="a_vote_num" id="a_vote_num_
引用来自“北京d路飞”的答案 “因为我的这个dialog是通过广播打开的,在关闭时会出现那个异常, 但是在点击按钮调出这个dialog然后再关闭时是没有问题的!”
那可以在接收到广播后,sendMessage给Activity的Handler,在Activity所在的UI Thread里打开这个Dialog,这样效果应该是和点击按钮调出这个dialog一样的。 我用system.exit(0);这种方法来代替finaish();这样就没有那些异常了!
<span class="a_vote_num" id="a_vote_num_
先把dialog的关闭.不要直接使用view的finish()掉.
更多开发者职位上
有什么技术问题吗?
穿裤衩闯...的其他问题
类似的话题Dialog关闭的方法dismiss()和cancel()都已经过时了怎么办?_android开发吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:61,672贴子:
Dialog关闭的方法dismiss()和cancel()都已经过时了怎么办?收藏
用dismiss一直报错说找不到该ID的dialog用cancel不报错,但是对话框还是关闭不了。有会的不?万分感谢
知道了,代码如下Dialog dialog = builder.show();dialog.cancel();
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或Icansoft 的BLOG
用户名:Icansoft
文章数:127
评论数:234
访问量:3033046
注册日期:
阅读量:3407
阅读量:2369
阅读量:2007
51CTO推荐博文
&& 本文是对网上的文章《Android开发指南-用户界面-对话框》的部分内容进行简化,并加上自己的某些理解。里面的相同内容,版权归原翻译作者所有。
显示对话框
&& &对话框经常作为Activity的一部分来创建和显示。你通常应该从protected Dialog&Activity.onCreateDialog (int id) 回调方法里创建对话框。当你使用这个回调函数时,Android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流。
注意:&如果你决定在onCreateDialog()方法之外创建一个对话框,它将不会被附着到活动上。不过,你可以通过setOwnerActivity(Activity)把它附着到一个活动上。&
&& &当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。
&& &当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。
&& &在对话框被显示之前,Android还调用了可选的回调函数onPrepareDialog(int id, Dialog). 如果你想在每一次对话框被打开时改变它的任何属性,你可以定义这个方法。这个方法在每次打开对话框时被调用,而onCreateDialog(int) 仅在对话框第一次打开时被调用。如果你不定义onPrepareDialog(),那么这个对话框将保持和上次打开时一样。这个方法也被传递以对话框的ID,和在onCreateDialog()中创建的对话框对象。(个人理解是,在本Activity里第一次show某个Dialog,则先调用onCreateDialog,得到返回的Dialog对象并挂靠在Activity,保存Dialog对象的引用,然后才显示Dialog。这样子,下次再show Dialog就不用重新创建Dialog对象,而是重用旧的)
&& &定义onCreateDialog(int) 和 onPrepareDialog(int, Dialog) 回调函数的最佳方法是使用一个switch 语句来检查传递进来的id 参数。每个case 应该检查一个唯一的对话框ID然后创建和定义相应的对话框。比如,想象一下一个游戏使用两个不同的对话框:一个用来指示这个游戏已经暂停而另一个来指示游戏结束。首先,为每个对话框定义一个常量:
static&final&int&DIALOG_PAUSED_ID&=&0;&static&final&int&DIALOG_GAMEOVER_ID&=&1;&
然后,为每一个ID用一个switch case定义这个onCreateDialog(int) 回调函数:
protected&Dialog&onCreateDialog(int&id)&{&&&&&Dialog&&&&&&switch(id)&{&&&&&case&DIALOG_PAUSED_ID:&&&&&&&&&&&&&&&&&&break;&&&&&case&DIALOG_GAMEOVER_ID:&&&&&&&&&&&&&&&&&&break;&&&&&default:&&&&&&&&&dialog&=&null;&&&&&}&&&&&return&&}&
当是时候显示其中之一的对话框时,使用对话框ID调用showDialog(int):
showDialog(DIALOG_PAUSED_ID);&
消除对话框Dismissing a Dialog
&& &当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。
&& &如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态(就如同在前面的章节讨论的那样),然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。
使用消除侦听器Using dismiss listeners
&& &如果你希望你的应用程序在一个对话框消亡的时候执行一些流程,那么你应该附着一个on-dismiss侦听器到对话框上。
@Override&protected&void&onPrepareDialog(int&id,&Dialog&dialog)&{&&&&&switch(id){&&&&&case&PROGRESS_DIALOG:&&&&&&&&&dialog.setOnDismissListener(new&DialogInterface.OnDismissListener(){&&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&onDismiss(DialogInterface&dialog)&{&&&&&&&&&&&&&&&&&Toast.makeText(getApplicationContext(),&&&&&&&&&&&&&&&&&&&&&&&&&&dismiss&listener!&,&&&&&&&&&&&&&&&&&&&&&&&&&Toast.LENGTH_SHORT)&&&&&&&&&&&&&&&&&.show();&&&&&&&&&&&&&}&&&&&&&&&});&&&&&}&}&
&& &然而, 请注意对话框也可以被&取消&。这是一个表明对话框被用户显示取消的特殊情况。这将在用户按&返回&按钮时发生,或者这个对话框显示的调用cancel() (也许通过对话框上的一个&取消&按钮)。当一个对话框被取消时,这个OnDismissListener 依然会被通知到,但是如果你希望在对话框被显示取消时被通知到(而不是通常的消除方式),那么你应该通过setOnCancelListener()注册一个DialogInterface.OnCancelListener 。
&& &目前个人学习发现,一般情况下,调用dialog.cancel()就会触发onCancelLister。而点击AlertDialog的NegativeButton (Cancel/No)是不会触发的。对于setOnCancelListener()要注意的是,这里有两个setOnCancelListener(),但返回值不同:
&public&AlertDialog.Builder&setOnCancelListener&(DialogInterface.OnCancelListener&onCancelListener)&&&public&void&setOnCancelListener&(DialogInterface.OnCancelListener&listener)&
警告对话框AlertDialog的使用
&& &为了创建一个警告对话框,使用AlertDialog.Builder 子类。通过AlertDialog.Builder(Context)获取一个构造器然后使用这个类的公共方法来定义警告对话框的所有属性。当得到构造器后,通过create().方法来获取警告对话框对象。有时我是不调用create()的,而是在设置好了后直接调用show()显示AlertDialog。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="Dialog_button" src="/attachment/524139.png" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="Dialog_button" src="/attachment/524820.png" />
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="Dialog_button" src="/attachment/524402.png" />
增加按钮Adding buttons
&& &这就是我一开始很想知道的究竟如何添加Yes/No,Ok/Cancel这样的按钮。原来是通过setPositiveButton(...)响应Yes/Ok的点击,setNeutralButton(...)响应中立行为的点击,setNegativeButton(...)响应No/Cancel的点击。注意,只能各自设置一个按钮来响应点击事件。
AlertDialog.Builder&builder&=&new&AlertDialog.Builder(this);&builder.setMessage(&Are&you&sure&you&want&to&exit?&)&&&&&&&&.setCancelable(false)&&&&&&&&.setPositiveButton(&Yes&,&new&DialogInterface.OnClickListener()&{&&&&&&&&&&&&public&void&onClick(DialogInterface&dialog,&int&id)&{&&&&&&&&&&&&&&&&&MyActivity.this.finish();&&&&&&&&&&&&}&&&&&&&&})&&&&&&&&.setNegativeButton(&No&,&new&DialogInterface.OnClickListener()&{&&&&&&&&&&&&public&void&onClick(DialogInterface&dialog,&int&id)&{&&&&&&&&&&&&&&&&&dialog.cancel();&&&&&&&&&&&&}&&&&&&&&});&AlertDialog&alert&=&builder.create();&
&& &首先,为这个对话框添加一个消息setMessage(CharSequence)。然后,开始函数链并设置该对话框为不能取消not cancelable (因此用户不能使用返回按钮关闭这个对话框)。对每个按钮,使用任一set...Button() 方法,比如setPositiveButton(),该方法接受按钮名称以及一个定义用户选中按钮后所采取动作的DialogInterface.OnClickListener。
增加一个列表Adding a list
final&CharSequence[]&items&=&{&Red&,&&Green&,&&Blue&};&&&AlertDialog.Builder&builder&=&new&AlertDialog.Builder(this);&builder.setTitle(&Pick&a&color&);&builder.setItems(items,&new&DialogInterface.OnClickListener()&{&&&&&public&void&onClick(DialogInterface&dialog,&int&item)&{&&&&&&&&&Toast.makeText(getApplicationContext(),&items[item],&Toast.LENGTH_SHORT).show();&&&&&}&});&AlertDialog&alert&=&builder.create();&
&& &首先,用setTitle(CharSequence)方法给对话框添加一个标题。然后,添加用setItems()添加一个可选项列表,该列表接受一组显示的items和一个DialogInterface.OnClickListener 来定义用户选中按钮后所采取动作。
增加复选框和单选按钮
&& &要在对话框里创建一个多选项列表(checkboxes)或者单选项(radio buttons),可分别调用setMultiChoiceItems() 和setSingleChoiceItems() 方法。如果你在onCreateDialog()回调函数中创建这些可选列表,Android会帮你管理列表状态。只要这个活动是激活的,对话框会记住之前选中的items,但如果用户退出这个活动,用户选择将丢失。
&& &注意: 为了在用户离开或暂停这个活动的时候能够保存选择,你必须通过活动生命期Activity Lifecycle来恰当的保存和恢复设置。为了永久保存选项,即使活动进程被完全终止,你需要使用数据存储Data Storage技术。
final&CharSequence[]&items&=&{&Red&,&&Green&,&&Blue&};&&&AlertDialog.Builder&builder&=&new&AlertDialog.Builder(this);&builder.setTitle(&Pick&a&color&);&builder.setSingleChoiceItems(items,&-1,&new&DialogInterface.OnClickListener()&{&&&&&public&void&onClick(DialogInterface&dialog,&int&item)&{&&&&&&&&&Toast.makeText(getApplicationContext(),&items[item],&Toast.LENGTH_SHORT).show();&&&&&}&});&AlertDialog&alert&=&builder.create();&
&& &setSingleChoiceItems() 的第二个参数是一个checkedItem整型数值,指示了基于0的缺省选择项的位置。&-1&代表不会有默认选择项。
进度对话框Progress Dialog的使用
&& &ProgressDialog是AlertDialog类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。
&& &可以简单地通过调用ProgressDialog.show()方法来显示一个进度对话框,而通过onCreateDialog(int)回调管理这个对话框是可选的,如下所示:
ProgressDialog.show(this,&&&&&&&&,&&&&&&&Loading.&Please&wait...&,&&&&&&true);&&
进度对话框的缺省类型是一个旋转轮,运行看到的是以下效果:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' border="0" alt="ProgressDialog" src="/attachment/807235.png" />
&& &由于ProgressDialog是AlertDialog的扩展类,所以ProgressDialog也能设置按钮,比如一个取消下载的按钮。不过要注意的是,和前面的AlertDialog.Builder不同,ProgressDialog是调用AlertDialog的setButton,setButton2,setButton3函数,这些函数没有明确哪个是正面/中立/负面的,由我们决定。
显示进度条Showing a progress bar
而选择动画进度条显示进度:
1. & 用类构造器初始化进度对话框,ProgressDialog(Context)。
2. & 用setProgressStyle(int)方法设置进度风格为&STYLE_HORIZONTAL&以及设置其它属性,比如消息。
创建ProgressDialog大概是这样的:
ProgressDialog&progressDialog&=&new&ProgressDialog(getApplicationContext());&&&&progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);&&progressDialog.setIcon(R.drawable.alert_dialog_icon);&&progressDialog.setMessage(&Loading...&);&&progressDialog.setCancelable(false);&&
3. & 当你准备显示这个对话框时,调用show()或者从onCreateDialog(int)回调中返回ProgressDialog。
4. & 你可以通过调用setProgress(int)设置当前进度百分比或者调用incrementProgressBy(int)方法增加进度值。
官方文档提供了如何在另一线程来跟踪进程进度,让进度值变化。对此可以参考里面的代码。也可以查看后面的文章《》里面的例子,看看如何使用Handler, Message机制!
创建自定义对话框Creating a Custom Dialog
&& &创建自定义对话框,首先要创建一个Layout xml 文件,在此不铝恕H缓蠹釉Layout有两种方法,也是非常熟悉的那两种方法:
&& &1.&setContentView(int resources id)
&& &2. 利用LayoutInflater加载
&& 官方还提示我们,一般使用Dialog类来创建对话框,是需要setTitle的,不设置的话,标题占用的空间保持为空,但仍然可见。而不想要那个标题,那应该使用警告对话框AlertDialog来创建自定义对话框。然而,因为警告对话框可以很简单的通过AlertDialog.Builder 类来创建,你并不需要访问上面使用的setContentView(int) 方法。相反,你必须使用setView(View),则需要使用LayoutInflater来加载Layout得到View。
具体代码参考
了这篇文章
类别:┆阅读(0)┆评论(0)
16:08:30 12:42:31 08:48:34 12:40:01 22:37:23 10:27:12&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
该文档贡献者很忙,什么也没留下。
&#xe602; 下载此文档
正在努力加载中...
ProgressDialog进度条和AlertDialog弹出对话框的使用
下载积分:30
内容提示:ProgressDialog进度条和AlertDialog弹出对话框的使用
文档格式:PDF|
浏览次数:224|
上传日期: 03:58:07|
文档星级:&#xe60b;&#xe60b;&#xe60b;&#xe612;&#xe612;
该用户还上传了这些文档
ProgressDialog进度条和AlertDialog弹出对话框的使用
官方公共微信

我要回帖

更多关于 dismiss和cancel 的文章

 

随机推荐