异常1-退出页面未及时关闭对话框

android.view.WindowLeaked: Activity com.example.netlib.activity.DemoHomeActivity has leaked windowDecorView@6891f75[DemoHomeActivity] that was originally added here
相关链接:https://blog.csdn.net/pbm863521/article/details/78656089

  • 错误原因

是因为activity中的Dialog、PopupWindow不能脱离activity而单独存在。当Dialog、PopupWindow正在显示的时候而它们依附的activity却destroy了,就会出现WindowLeaked异常。

  • 解决办法

在finish 某个activity之前要确保依附于其上的Dialog、PopupWindow已经dismiss了

@Override
    protected void onDestroy() {
        super.onDestroy();
        if(progressDialog!=null&&progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

异常2-设置宽高无效

  • 解决办法
    方法1:
//设置窗口的大小
dialog.getWindow().setLayout(300, 200);

方法2:

WindowManager.LayoutParams params = dialog.getWindow().getAttributes();  
params.width = 300;  
params.height = 200;  
dialog.getWindow().setAttributes(params); 

方法3:
在根布局套一层布局

  • 异常原因

参考我的另一篇文章http://xinyiworld.top/wordpress/?p=4422

因为AlertDialog的view是inflate时并不知道root是哪个,所以根布局的layout会失效。

异常3-Unable to add window -- token null is not valid; is your activity running?

如果就想使用application context来构造Dialog,也是可以的。只需要

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);

这样的话就可以在Application里定义一个全局的单例的Dialog用来网络加载了!不必每个页面都要去创建dialog。

异常4-Dialog布局高度被意外的match_parent

问题:
在RelativeLayout里设置android:layout_alignParentBottom="true",导致Dialog布局的高度match_parent。

解决方案:使用ConstraintLayout替代RelativeLayout

分类: 对话框

0 条评论

发表回复

您的电子邮箱地址不会被公开。