SystemUI屏蔽原生下拉状态栏的通知区域导致下拉展开高度异常问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WDYShowTime/article/details/82852843

不积跬步无以至千里       

1、简叙

由于项目需求需要把下拉状态栏中的通知显示部分屏蔽掉,不让其显示出来,由android7.0移植到android8.0,还是按照以前的屏蔽方式,屏蔽掉了原生的通知区域。

2、问题

发现了如下了,多数情况是挺正常的。如下截图:

图一:

图一

 但是当收到电话、短信等一些特殊通知时,会出现如下截图现象:

图二:

 被测试提出了这样的bug,当时移植项目之前就感觉多多少少会出现一些问题,毕竟要适配刘海平,出现了,咱们就解决。

扫描二维码关注公众号,回复: 3578854 查看本文章

3、观察

因为发现是当收到一些特殊通知的时候会出现这个样子,因此一部分原因肯定是通知的问题造成的,因此先把之前屏蔽的通知区域放开,查看一下现象。经发现,如图。

图三:

其第二张图的收缩的高度正好是上边截图的滚动产生的View,通过Monitor工具抓取这个View的布局,查看这个View的id为backgroundNormal,然后通过搜索代码,查看到这个控件相关的类有两个

一个是NotificationShelf,另一个是ExpandableNotificationRow,然后分别对应着布局名为:status_bar_notification_shelf.xml与status_bar_nofitication_row.xml,其实他们都是通知的单条对应的布局。

但是第一个NotificationShelf,它是就是上边图三中的QuickSettings下边的那一栏的带一个点的一行,其实它代表了通知区域的一条信息。因此这个NotificationShelf这个布局的作用是用来显示多少条被收缩的通知应用的图标。(收缩就是指你上推状态栏的时候,一条条通知被隐藏,然后所对应的通知就会通过最下边这一栏来显示被隐藏通知的图标)。

而第二个ExpandableNotificationRow就是逐条显示的各个应用的详细通知布局。

4、猜测

上边也有说到,其中根据收缩高度以及现象,怀疑

①、当测量展开高度时没有计算下边这个NotificationShelf这一条的高度导致给的展开高度偏小

②、没有被隐藏而只是不可见状态(意思是没有gone掉),但是InVisible的控件也是计算控件高度及大小的。

5、验证

①、先验证第一条猜测,通过跟踪代码发现其中关于计算状态栏的下拉展开高度在SystemUI的NotificationPanelVIew的getMaxPanelHeight这个方法。然后其中方法如下截图:

其中通过打印这个maxHeight(这个值就是展开高度值),其实看if语句有两种高度,一种是完全展开即QuickSettings也展开的高度,二者是QuickSettings不展开,通过打印这个maxHeight发现当不存在特殊通知(就是正常现象,正常高度的展开高度)与存在特殊通知(就是不正常现象,不正常的展开的高度 )的时候其打印的maxHeight的值是一样的,所以第一种猜测排除。发现其实第一种的说法也没有错误,只是一直给的定值,并没有计算NotificationShelf的高度,也只能说当有特殊通知的时候,咱们状态栏中NotificationShelf的状态不对,看似是没有显示,但是其占有一定空间位置的。

②、验证第二条,通过查看NotificationShelf类,其中如下截图:

 其中这里通过获取config.xml的值来控制NotificationShelf的显示和隐藏,通过代码也可以看到,其中通过读取的值mShowNotificationShelf来控制这个控件的显示和隐藏。这里我们改一下config中对应的boolean值,改为false,原本是true,测试了一下,真的这个NotificationShelf被隐藏了,而且现在下拉也恢复正常了。

6、结论

第一种猜测得出一部分结论,通过第二种方法测试验证了这个结论,问题得以解决。

猜你喜欢

转载自blog.csdn.net/WDYShowTime/article/details/82852843