前情提要
前文提到,DialogV3 库在有刘海屏的设备上出现了双重导航栏高度的问题,实际上这个问题是因为屏幕“危险区”导致的,于是就有了不完美解决方案 这篇文章,里边的解决方法也只是做到了判断是否具有“刘海”,然后通过界面布局规避掉这部分区域,但实际上这样的处理方案并非完美,因为如果我们非得将界面显示到刘海区域这是做不到的。
正因此有了这篇文章,通过查询API文档,现在已经找到了合理的解决方案,可以让任意 Window 沉浸到刘海区域中,从而彻底解决这个问题。
解决方案
通过查阅API文档后发现,在API-28(Android P)后Google在WindowManager.LayoutParams新增了一个API:
params.layoutInDisplayCutoutMode
其大致用法和含义为:
//如果有{@link DisplayCutout},则控制窗口的布局方式。
Controls how the window is laid out if there is a {@link DisplayCutout}.
其具有三个可选属性值,分别对应:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
看注释大致上说明就是这个值管控了是否允许布局扩展到刘海部分,而其中 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 是允许的,但是用这个属性有个条件,即布局不能设置以下Flag:
SYSTEM_UI_FLAG_FULLSCREEN
FLAG_FULLSCREEN
那么,在Dialog启动后,对其Window的属性进行如下修改:
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
}
即可完成刘海部分沉浸式的适配工作。
实际运行效果完美满足需求。