JYDialog(DialogPlus)为什么显示的时候没有全屏显示(没有遮挡状态栏和标题栏)

目前在有的项目中显示对话框的Dialog是用的JYDialog来完成的,用法很简单,查看过部分源码,发现并不是系统自带的Dialog,但是在显示的时候会出现状态栏不能遮挡的问题,显示如下:


图1

会发现Dialog是在状态栏以下开始显示的,无法遮盖住状态栏,会有留白。如果项目中用到了Toolbar后标题栏也不会被覆盖如下图:


图2
Dialog是在标题栏(Toolbar)以下显示的,如果标题栏不是Toolbar是自定义的View,就会显示正常,如图1的样式。为什么会出现上面这两种情况呢?
首先查看JYDialog代码,看一下是如何实现的。dialog显示的是show()方法,代码如下:
图3
图4

通过代码可以看出将rootView通过addView的方式动态添加到decorView布局中,rootView是通过inflate填充的JYDialog真正的布局文件。重点是看decorView,而decorView是什么呢?继续查看代码,看decorView是在哪初始化的。
图5
看到这里我们大概会有点明白了为什么显示的时候会在状态栏以下显示了,这里的decorView跟真正意义的decorView是有区别的,并不是窗口的顶级视图。应该是DecorView负责绘制用户定义UI的视图区域,首先我们先了解一些基础,Activity的Gui构建的大致模型简图
图6
我们可以通过Layout Inspector来查看下布局层级,Layout Inspector是Android studio自带的视图层次结构分析工具(Android Studio 2.2及其之后版本),界面虽不如Hierarchy View直观,但是提供的信息也足够详细了。
我们可以随便创建一个布局文件,带Toolbar标题栏的情况。运行项目后,打开Layout Inspector如下图所示:
图7
主要看第二层的LinearLayout->FrameLayout,LinearLayout是我们创建布局的根布局。DecorView是PhoneWindow类的内部类。该类是一个FrameLayout的子类,并且是PhoneWindow的子类,该类就是对普通的FrameLayout进行功能的扩展,更确切点可以说是修饰(Decor的英文全称是Decoration,即“修饰”的意思),比如说添加TitleBar(标题栏),以及TitleBar上的滚动条等 。最重要的一点是,它是所有应用窗口的根View ,我们的自定义布局其实都是加到了id/content下。而JYDialog是通过DecorView获取的android.R.id.content,通过addView动态添加到FrameLayout中 所以JYDialog显示是在状态栏和标题栏下显示的。

我们来看一下当JYDialog显示时候的层级视图,验证下是不是所说的添加到Fragment中
图8

这会明显的看出JYDialog显示的区域是在什么位置,所以会出现标题栏和状态栏不能覆盖,显示的很奇怪。

JYDialog并不是在所有的项目中都会显示成这样,这主要是跟SDK版本相关。在不同的SDK版本下,该FrameLayout所指的显示区域也不同。具体如下
在sdk 14+(native ActionBar),该显示区域指的是ActionBar下面的部分
在Support Library revision lower than 19,使用AppCompat,则显示区域包含ActionBar
在Support Library revision 19 (or greater),使用AppCompat,则显示区域不包含ActionBar,即行为与第一种情况相同。
所以如果不使用Support Library或使用Support Library的最新版本,则R.id.content所指的区域都是ActionBar以下。

你可能感兴趣的:(JYDialog(DialogPlus)为什么显示的时候没有全屏显示(没有遮挡状态栏和标题栏))