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

&&&&&&&&&&&&&
先上cancel方法源码和注解
* Cancel the dialog.
This is essentially the same as calling {@link #dismiss()}, but it will
* also call your {@link DialogInterface.OnCancelListener} (if registered).
public void cancel() {
if (!mCanceled && mCancelMessage != null) {
mCanceled = true;
// Obtain a new message so this dialog can be re-used
Message.obtain(mCancelMessage).sendToTarget();
dismiss();
注解的大意:cancel对话框,这个在本质上基本和disimss一样。但是cancel会执行DialogInterface.OnCancelListener监听,前提是有注册过。
public void openDialog(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题");
builder.setMessage("dismiss和cancel的区别");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
dialog = builder.create();
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
Toast.makeText(MainActivity.this, "setOnCancelListener", Toast.LENGTH_SHORT).show();
dialog.show();
点击确定按钮后会执行DialogInterface.OnCancelListener();弹出Toast且关闭对话框。
&posted on
阅读(...) 评论()你的位置: >
> Solution of java.lang.IllegalArgumentException: View not attached to window manager
项目里的ProgressDialog导致了这么一个IllegalArgumentException异常,原因是在延时线程里调用了ProgressDialog.dismiss,但此时主Activity已经destroy了。于是应用崩溃,我写了一个&SafeProgressDialog 来避免这个问题,主要原理是覆写dismiss方法,在ProgressDialog.dismiss之前判断Activity是否存在。
在看源码之前先看看异常:
12-10&07:33:36.193&&&&/com.example.LoadingProgressDialogTest&E/AndroidRuntime﹕&FATAL&EXCEPTION:&main
&&&&java.lang.IllegalArgumentException:&View&not&attached&to&window&manager
&&&&&&&&&&&&at&android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:383)
&&&&&&&&&&&&at&android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:285)
&&&&&&&&&&&&at&android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:79)
&&&&&&&&&&&&at&android.app.Dialog.dismissDialog(Dialog.java:323)
&&&&&&&&&&&&at&android.app.Dialog.dismiss(Dialog.java:306)
&&&&&&&&&&&&at&com.example.LoadingProgressDialogTest.MyActivity$1.run(MyActivity.java:33)
&&&&&&&&&&&&at&android.os.Handler.handleCallback(Handler.java:725)
&&&&&&&&&&&&at&android.os.Handler.dispatchMessage(Handler.java:92)
&&&&&&&&&&&&at&android.os.Looper.loop(Looper.java:137)
&&&&&&&&&&&&at&android.app.ActivityThread.main(ActivityThread.java:5041)
&&&&&&&&&&&&at&java.lang.reflect.Method.invokeNative(Native&Method)
&&&&&&&&&&&&at&java.lang.reflect.Method.invoke(Method.java:511)
&&&&&&&&&&&&at&com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
&&&&&&&&&&&&at&com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
&&&&&&&&&&&&at&dalvik.system.NativeStart.main(Native&Method)
一段fire bug 代码:
public&class&MyActivity&extends&Activity
&&&&private&ProgressDialog&mProgressD
&&&&&*&Called&when&the&activity&is&first&created.
&&&&@Override
&&&&public&void&onCreate(Bundle&savedInstanceState)
&&&&&&&&super.onCreate(savedInstanceState);
&&&&&&&&setContentView(R.layout.main);
&&&&&&&&//&The&code&below&throws&a&java.lang.IllegalArgumentException:&View&not&attached&to&window&manager
&&&&&&&&//&Which&makes&your&app&crashed
&&&&&&&&mProgressDialog&=&new&ProgressDialog(this);
&&&&&&&&//&But&my&SafeProgressDialog&will&solve&this&issue
//&&&&&&&&mProgressDialog&=&new&SafeProgressDialog(this);
&&&&&&&&mProgressDialog.show();
&&&&&&&&new&Handler().postDelayed(new&Runnable()
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public&void&run()
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&mProgressDialog.dismiss();
&&&&&&&&&&&&}
&&&&&&&&},&1000);
&&&&&&&&finish();
我写的SafeProgressDialog ,可以完美地防止IllegalArgumentException:
class&SafeProgressDialog&extends&ProgressDialog
&&&&Activity&mParentA
&&&&public&SafeProgressDialog(Context&context)
&&&&&&&&super(context);
&&&&&&&&mParentActivity&=&(Activity)&
&&&&@Override
&&&&public&void&dismiss()
&&&&&&&&if&(mParentActivity&!=&null&&&&!mParentActivity.isFinishing())
&&&&&&&&&&&&super.dismiss();&&&&//调用超类对应方法
为了方便测试,你可以直接复制下面这段代码来测试我的代码:
package&com.hankcs.LoadingProgressDialogT
import&android.app.A
import&android.app.ProgressD
import&android.content.C
import&android.os.B
import&android.os.H
public&class&MyActivity&extends&Activity
&&&&private&ProgressDialog&mProgressD
&&&&&*&Called&when&the&activity&is&first&created.
&&&&@Override
&&&&public&void&onCreate(Bundle&savedInstanceState)
&&&&&&&&super.onCreate(savedInstanceState);
&&&&&&&&setContentView(R.layout.main);
&&&&&&&&//&The&code&below&throws&a&java.lang.IllegalArgumentException:&View&not&attached&to&window&manager
&&&&&&&&//&Which&makes&your&app&crashed
//&&&&&&&&mProgressDialog&=&new&ProgressDialog(this);
&&&&&&&&//&But&my&SafeProgressDialog&will&solve&this&issue
&&&&&&&&mProgressDialog&=&new&SafeProgressDialog(this);
&&&&&&&&mProgressDialog.show();
&&&&&&&&new&Handler().postDelayed(new&Runnable()
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public&void&run()
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&mProgressDialog.dismiss();
&&&&&&&&&&&&}
&&&&&&&&},&1000);
&&&&&&&&finish();
class&SafeProgressDialog&extends&ProgressDialog
&&&&Activity&mParentA
&&&&public&SafeProgressDialog(Context&context)
&&&&&&&&super(context);
&&&&&&&&mParentActivity&=&(Activity)&
&&&&@Override
&&&&public&void&dismiss()
&&&&&&&&if&(mParentActivity&!=&null&&&&!mParentActivity.isFinishing())
&&&&&&&&&&&&super.dismiss();&&&&//调用超类对应方法
转载请注明: &
与本文相关的文章ProgressDialog的dismiss方法与cancel方法的区别
ProgressDialog,它有两个方法dialog.cancel()
和dialog.dismiss();
都是取消关闭ProgressDialog,有什么区别吗?
查询API文档,ProgressDialog继承于Dialog,而cancel和dismiss就是在Dialog类中。
void&cancel&()
Cancel the dialog. This is essentially the same as
but it will also call your&(if
registered).
取消对话框,基本上和调用dismiss效果一样。但是cancel同事也会调用注册的事件,如果注册了。
void&dismiss&()
Dismiss this dialog, removing it from the screen. This method
can be invoked safely from any thread. Note that you should not
override this method to do cleanup when the dialog is dismissed,
instead implement that in.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。ProgressDialog的dismiss方法与cancel方法的区别 - butter - ITeye技术网站
博客分类:
ProgressDialog,它有两个方法dialog.cancel() 和pdialog.dismiss(); 都是取消关闭ProgressDialog,但它们有什么区别吗?
就是当使用cancel()的时候,则会同时调用你注册的()这个方法。以下是相关API的解释
public void cancel ()
Since: API Level 1
Cancel the dialog. This is essentially the same as calling dismiss(), but it will also call your DialogInterface.OnCancelListener (if registered).
public void dismiss ()
Since: API Level 1
Dismiss this dialog, removing it from the screen. This method can be
invoked safely from any thread. Note that you should not override this
method to do cleanup when the dialog is dismissed, instead implement
that in onStop().
&!--EndFragment--&
浏览: 47460 次
来自: 广州
RoyMax 写道靠,我的文章在这里出来了,源连接在这里 ht ...
我尝试过你的办法了。
但扫描的时候 扫描不到条码呢。为什么呢、 ...
发送邮件时的速度超级慢??
不错的文章,谢谢分享
靠,我的文章在这里出来了,源连接在这里 http://blog ...当前访客身份:游客 [
:多谢! 解决了我自定义link与内置link共存的问题...
:支持一下
:请问 orientation 变量从何而来。如何对其复制...
:楼主,我最近在处理一个问题,把你这三篇文章全部...
:楼主的博文写的很棒,解释的很详细清楚,不知道何...
:楼主为什么不直接继承自LinearLayout呢?...
:学习了,
今日访问:60
昨日访问:29
本周访问:60
本月访问:1133
所有访问:18971
Android中Dialog与DialogFragment的对比
发表于1年前( 21:39)&&
阅读(10989)&|&评论()
0人收藏此文章,
最近学习对话框时发现有两种类型的可供使用,一种是Dialog,另一种则是Android 3.0 引入的基于Fragment的DialogFragment。
从代码的编写角度看,Dialog使用起来要更为简单,但是Google则是推荐尽量使用DialogFragment(对于Android 3.0以下的版本,可以结合使用support包中提供的DialogFragment以及FragmentActivity)。今天试着用这两种方式来创建对话框,发现DialogFragment果然有一个非常好的特性(在手机配置变化,导致Activity需要重新创建时,例如旋屏,基于DialogFragment的对话框将会由FragmentManager自动重建,然而基于Dialog实现的对话框则没有这样的能力)。
下面是两段实例代码:
他们使用的界面都一样:(dialog.xml)
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
&ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" /&
&/LinearLayout&
1.基于Dialog实现的对话框
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clk = (Button) findViewById(R.id.clk);
dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog);
clk.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.show();
当我们点击按钮时,会弹出对话框(内容为android logo),当我们旋转屏幕后,Activity重新创建,整个Activity的界面没有问题,而对话框消失了。
除此之外,其实还有一个问题,就是在logcat中会看到异常信息:Android..leaked .. window,这是因为在Activity结束之前,Android要求所有的Dialog必须要关闭。我们旋屏后,Activity会被重建,而上面的代码逻辑并没有考虑到对话框的状态以及是否已关闭。
于是将上述代码修改为:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clk = (Button) findViewById(R.id.clk);
dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog);
clk.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.show();
//用户恢复对话框的状态
if(savedInstanceState != null && savedInstanceState.getBoolean("dialog_show"))
clk.performClick();
* 用于保存对话框的状态以便恢复
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(dialog != null && dialog.isShowing())
outState.putBoolean("dialog_show", true);
outState.putBoolean("dialog_show", false);
* 在Activity销毁之前,确保对话框以关闭
protected void onDestroy() {
super.onDestroy();
if(dialog != null && dialog.isShowing())
dialog.dismiss();
2. 基于DialogFragment的对话框
与上面的对话框使用同样的界面布局,此处仅仅展现一个简单对话框,因此只重写了onCreateView方法
public class MyDialogFragment extends DialogFragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.dialog, container, false);
public class MainActivity extends FragmentActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clk = (Button) findViewById(R.id.clk);
clk.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MyDialogFragment mdf = new MyDialogFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
mdf.show(ft, "df");
这两段代码可以实现第一种方式的同样功能,此处我们并没有去关心对话框的重建,以及Activity销毁前对话框是否已关闭,这一切都是由FragmentManager来管理。
其实DialogFragment还拥有fragment的优点,即可以在一个Activity内部实现回退(因为FragmentManager会管理一个回退栈)
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读

我要回帖

更多关于 data dismiss 的文章

 

随机推荐