使用Dialog时需要注意的问题

dialog使用时需要注意的问题:

  1. 在Activity关闭前一定要先把dialog给dismiss掉,否则会报错,activity状态判断方法如下:
    boolean finishing = activity.isFinishing(); //
    boolean b = activity.hasWindowFocus(); //windown显示在当前时候才获取焦点,才为true
    boolean destroyed = activity.isDestroyed(); //需要android版本在17以上
  1. 其所使用的context必须要用Activity的;
  1. 作为工具类中的通用方法时,需要注意 "顶层、单一"显示原则;
  1. 在调用dialog.show();前,一定要先判断其所依赖的Activity是否还存在;
  1. 在给Dialog全屏设置时,需要先进行:dialog.getWindow().getDecorView().setPadding(0, 0, 0, 0); 因为对话框的样式文件内部有pading属性,否则不管我们怎样设置lp.width,lp.x,lp.y对话框水平方向是占不满的,左右始终是有间距的。
  1. 报View not attached to window manager 错误:
    这个错误的意思是说我们所操作的View没有被纳入window manager的管理。因为所有的窗口创建和管理都是依附于window manager的,因此Dialog的创建也不例外。

错误分析:在Dialog显示期间,该Activity因为某种原因被杀掉且又重新启动了,那么当任务结束时,Dismiss Dialog的时候WindowManager检查,就会发现该Dialog所属的Activity已经不存在了(重新启动了一次,是一个新的Activity),所以会报IllegalArgumentException: View not attached to window manager.(注意:当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。)

  • 如何解决这个问题呢?
    1.使用Activity自带的Dialog控制方法:
    在Activity中需要使用对话框,可以使用Activity自带的回调,比如onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。毕竟这些都是Activity自带的方法,所以用起来更方便,也不用显示创建和操控Dialog对象,一切都由框架操控,相对来说比较安全。
    2.限制Dialog的生命周期:
    让创建的Dialog对象的存活周期跟Activity的生命周期一致,也就是说Dialog的生命周期被限定在Activity的onCreate()和onDestroy()方法之间。

实例:

    public static void showDialog(final Activity activity) {
        if (alert != null && alert.isShowing()) {  //设置只在最顶层显示一个dialog
          alert.dismiss();
          alert = null;
        }
        builder = new AlertDialog.Builder(activity);
        alert = builder.setTitle("下线通知")
            .setMessage("您的账号已于异地登录")
            .setNeutralButton("退出", new DialogInterface.OnClickListener() {
              @Override public void onClick(DialogInterface dialog, int which) {
                SPTools.put(activity, Constant.TOKEN, "");
                activity.startActivity(new Intent(activity, LoginActivity.class));
                alert.dismiss();
              }
            })
            .setPositiveButton("重新登录", new DialogInterface.OnClickListener() {
              @Override public void onClick(DialogInterface dialog, int which) {
                SPTools.put(activity, Constant.TOKEN, "");
                activity.startActivity(new Intent(activity, LoginActivity.class));
                alert.dismiss();
              }
            })
            .create();             //创建AlertDialog对象
        alert.setCanceledOnTouchOutside(false);
        alert.setCancelable(false);
        if (activity.isFinishing()) {
          alert.show();
        }
      }

附加:

Dialog应用举例:

Dialog picDialog = new Dialog(activity, R.style.AlertDialogStyle);  //自带属性设置
        Window dialogWindow = picDialog.getWindow();
        picDialog.setContentView(dialogContentView);
        picDialog.setCancelable(true);
        dialogWindow.setWindowAnimations(R.style.DialogBottom);  //dialog添加动画
        dialogWindow.setGravity(Gravity.BOTTOM);
        picDialog.show();
    <!-- 照相机相册显示AlertDialog的样式 -->
    <style name="AlertDialogStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
        <item name="android:windowFrame">@null</item><!--边框-->
        <item name="android:backgroundDimEnabled">true</item><!--模糊-->
        <item name="android:windowNoTitle">true</item><!--无标题-->
        <item name="android:windowIsTranslucent">false</item><!--半透明-->
    </style>
 <!-- Dialog的动画样式 -->
    <style name="DialogBottom">
        <item name="@android:windowEnterAnimation">@anim/dialog_enter</item>
        <item name="@android:windowExitAnimation">@anim/dialog_exit</item>
    </style>

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="50%p"
        android:duration="200"
        />
</set>

.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容