页面闪退后自适应高度的ViewPager高度会拉长 & Resources.getSystem().displayMetrics.widthPixels 不是一个固定值

遇到一个奇葩的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 不是一个固定值

うずまき ナルト

你可能感兴趣的:(页面闪退后自适应高度的ViewPager高度会拉长 & Resources.getSystem().displayMetrics.widthPixels 不是一个固定值)