遇到一个奇葩的bug。
自适应高度的ViewPager 在页面闪退时,高度会拉长!有一段空白区,特别丑!
分析
打断点,发现问题:
Resources.getSystem().displayMetrics.widthPixels 不是一个固定值
获取设备宽高的代码
val appWidth = Resources.getSystem().displayMetrics.widthPixels
val appHeight = Resources.getSystem().displayMetrics.heightPixels
1. 正常情况进入页面,返回 appWidth 为 1080
(宽度与设备有关,因为该页面是横屏展示,所以取设备的宽来计算)
2. 页面崩溃后,再次进入页面,返回 appWidth 为 2061
发现这个问题后,我都震惊了!!!
页面方向仍是横屏,为什么崩溃后返回的设备宽度值改变了?
而且变大了(导致页面高度计算错误,出现了拉长的情况)
定位问题
多次复现(特意写了一个数组下标越界的bug),发现该值是固定值 2061 ,
也就是说该值可能是设备的一个参数,考虑到可能会有横屏的影响,
我断点了设备的高度 appHeight 。
1. 正常情况下,设备的宽高值
看到这,你可能觉得完了,这里是2150 ,而不是2061,所以不是它!
你忽略了状态栏的高度。
继续往下看:
2. 崩溃后再次进入页面的设备宽高值
1080 !!!
要的就是 1080 ,设备真正的宽,但是现在appHeight的值是1080。
所以我取两者最小值(如果你用高度,可以取最大值),再进行计算。
val systemHeight = if (appWidth > appHeight) appHeight else appWidth
if (height < systemHeight - top) {
height = systemHeight - top
maxList.add(height)
} else {
maxList.add(height)
}
height = maxList.max()!!
bug解决了!!!
一直以为在特定屏幕方向时,其设备宽高是一个固定值,看来不是!!
Resources.getSystem().displayMetrics.widthPixels 不是一个固定值
网友评论