Android dialog 问题

1.dialog.dismiss和dialog.cancel的区别

Cancel the dialog. This is essentially the same as calling dismiss(), but it will also call your DialogInterface.OnCancelListener (if registered).

取消对话框,基本上和调用dismiss效果一样。但是cancel同事也会调用DialogInterface.OnCancelListener注册的事件,如果注册了。

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().

dismiss是线程安全的。

2.但使用dismiss的时候,会遇到一些问题,下面来罗列一下这些问题以及解决方法。

比如在界面上显示一个Dialog,当任务处理结束后再Dismiss Dialog。如果在Dialog显示期间,该Activity因为某种原因被杀掉且又重新启动了,那么当任务结束时,Dismiss Dialog的时候WindowManager检查,就会发现该Dialog所属的Activity已经不存在了(重新启动了一次,是一个新的Activity),所以会报IllegalArgumentException: View not attached to window manager.

当我们的Dialog还没有dismiss时,如果此时该Activity被销毁了,那么就会出现以上错误,提示窗口泄漏(leaked window)。

出现这个异常的原因可能是,在dismiss对话框的时候,它所在的activity因为一些原因已经先退出了,所以会出现这个异常。

附加一个网址,里面有一些我自己认为很不错的android的问题以及解决方法

http://www.2cto.com/kf/201502/375068.html

<a> 两种方法 <1>.

目前我认为最好的解决方法是,使用Activity里面封装好的showDialog(int id)和dismissDialog(int id)方法。

使用Activity自带的Dialog控制方法

在Activity中需要使用对话框,可以使用Activity自带的回调,比如onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。毕竟这些都是Activity自带的方法,所以用起来更方便,也不用显示创建和操控Dialog对象,一切都由框架操控,相对来说比较安全。

如何使用,下面是代码demo

  1. package com.sinaapp.msdxblog.android.lol.activity;
  2. import android.app.Activity;
  3. import android.app.Dialog;
  4. import android.app.ProgressDialog;
  5. import android.content.Context;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.webkit.WebView;
  9. import android.webkit.WebViewClient;
  10. import android.widget.FrameLayout;
  11. import android.widget.FrameLayout.LayoutParams;
  12. import android.widget.LinearLayout;
  13. import com.sinaapp.msdxblog.android.lol.R;
  14. import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;
  15. /**
  16. * @author Geek_Soledad ([email protected])
  17. */
  18. public abstract class WebViewActivity extends Activity {
  19. protected WebView mSearchWV;
  20. protected Context mContext;
  21. private static final int PROGRESS_ID = 1;
  22. /**
  23. * 返回需要加载的URL地址。
  24. *
  25. * @return 需要加载的URL地址。
  26. */
  27. protected abstract String getHomeUrl();
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. mContext = this;
  32. mSearchWV = new WebView(mContext);
  33. mSearchWV.getSettings().setJavaScriptEnabled(true);
  34. mSearchWV.setWebViewClient(new WebViewClient() {
  35. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  36. view.loadUrl(url);
  37. return true;
  38. }
  39. @Override
  40. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  41. super.onPageStarted(view, url, favicon);
  42. showDialog(PROGRESS_ID);
  43. }
  44. @Override
  45. public void onPageFinished(WebView view, String url) {
  46. super.onPageFinished(view, url);
  47. dismissDialog(PROGRESS_ID);
  48. }
  49. });
  50. addContentView(mSearchWV, new FrameLayout.LayoutParams(
  51. LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
  52. mSearchWV.loadUrl(getHomeUrl());
  53. }
  54. @Override
  55. protected Dialog onCreateDialog(int id) {
  56. if (id == PROGRESS_ID) {
  57. return ProgressDialog.show(mContext, null,
  58. mContext.getString(R.string.loading));
  59. }
  60. return super.onCreateDialog(id);
  61. }
  62. }

<2>

限制Dialog的生命周期

让创建的Dialog对象的存活周期跟Activity的生命周期一致,也就是说Dialog的生命周期被限定在Activity的onCreate()和onDestroy()方法之间。

  1. private void closeDialog() {
  2. if (mDialog != null && mDialog.isShowing()) {
  3. mDialog.dismiss();
  4. }
  5. }
  6. @Override
  7. protected void onDestroy() {
  8. Log.d(TAG, "called onDestroy");
  9. mIsDestroyed = true;
  10. closeDialog();  //在这里也可以换成dialog=null
  11. super.onDestroy();
  12. }

<b> 下面是一种高大上的解决方法,在源码的基础上。

项目里的ProgressDialog导致了这么一个IllegalArgumentException异常,原因是在延时线程里调用了ProgressDialog.dismiss,但此时主Activity已经destroy了。于是应用崩溃,我写了一个 SafeProgressDialog 来避免这个问题,主要原理是覆写dismiss方法,在ProgressDialog.dismiss之前判断Activity是否存在。

下面是一个自定义的SafeProgressDialog,可以完美地防止IllegalArgumentException。

class SafeProgressDialog extends ProgressDialog

{

Activity mParentActivity;

public SafeProgressDialog(Context context)

{

super(context);

mParentActivity = (Activity) context;

}

@Override

public void dismiss()

{

if (mParentActivity != null && !mParentActivity.isFinishing())

{

super.dismiss();    //调用超类对应方法

}

}

}

下面是测试demo的代码

package com.hankcs.LoadingProgressDialogTest;

import android.app.Activity;

import android.app.ProgressDialog;

import android.content.Context;

import android.os.Bundle;

import android.os.Handler;

public class MyActivity extends Activity

{

private ProgressDialog mProgressDialog;

/**

* 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 mParentActivity;

public SafeProgressDialog(Context context)

{

super(context);

mParentActivity = (Activity) context;

}

@Override

public void dismiss()

{

if (mParentActivity != null && !mParentActivity.isFinishing())

{

super.dismiss();    //调用超类对应方法

}

}

}

下面贴一个安卓实战技巧dialog的 http://www.doc88.com/p-772890177672.html

http://blog.csdn.net/hitlion2008/article/details/7567549

时间: 2024-09-12 05:20:31

Android dialog 问题的相关文章

Android dialog 全屏

Android中让Dialog全屏: 一.在style中定义样式: <?xml version="1.0" encoding="utf-8"?> <resources> <style name="Transparent"> <item name="android:windowBackground">@color/transparent_background</item>

7种形式的Android Dialog使用举例

7种形式的Android Dialog使用举例 在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助. 1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式. 创建dialog对话框方

Android Dialog 的一些特性

1. Dialog 与 AlertDialog 的区别. AlertDialog 是一种特殊形式的 Dialog.这个类中,我们可以添加一个,两个或者三个按钮,可以设置标题.所以,当我们想使用 AlertDialog 默认的按钮形式,用 AlertDialog 更加方便,而且有一个类 AlertDialog.Builder 很方便创建一个 AlertDialog. 2. Dialog 与 AlertDialog 写代码时需注意的事项. 我们可以给一个 Dialog 用自定义的 Layout.有两

几种不同的Android Dialog

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助. 1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式. 创建dialog对话框方法代码如下: ? 1 2 3 4 5 6 7 8

在 ANDROID DIALOG中使用

我想再android Dialog中使用 autocompletetext, 在开发测试过程中碰见不少问题,把最后的成品发布出来,避免大家走弯路,下面的代码是完整代码详细代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 5

自定义Android Dialog

private void showDialog() { mDialog = new Dialog(this); mDialog.setCanceledOnTouchOutside(true); Window dialogWindow = mDialog.getWindow(); dialogWindow.setBackgroundDrawable(new ColorDrawable(0)); dialogWindow.setContentView(R.layout.set_public_clie

Android控件——7种形式的Android Dialog使用举例

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助. 1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式. 创建dialog对话框方法代码如下: ? 1 2 3 4 5 6 7 8

Android Dialog使用举例

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助. 1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式. 创建dialog对话框方法代码如下: protected void di

Android控件——7种形式的Android Dialog使用举例(转载)

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助. 1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式. 创建dialog对话框方法代码如下: 1 2 3 4 5 6 7 8 9

Android Dialog常见使用

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择,从而增强APP与用户之间的交互体验,使得APP灵活性提高了,也达到了Android最初的智能目标.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助. 下面就一一介绍Android开发常用的 几种 Dial