美文网首页
7.0以上PopupWindow显示问题解析

7.0以上PopupWindow显示问题解析

作者: littleGrow | 来源:发表于2018-10-18 18:21 被阅读0次

问题:当在自定义的PopupWindow中setHeight(ViewGroup.LayoutParams.MATCH_PARENT)时,在7.0以下调用popupWindow.showAsDropDown方法时显示正常,但在7.0及以上调用时显示不正常(PopupWindow没有显示在控件下方,而是从屏幕顶部开始显示)

解析:从7.0的源码中去发现问题所在,从而找到解决办法。

图1

在图1中1的位置是寻找PopupWindow在屏幕中的位置,也是出现问题所在。接下来,我们去详细看看该方法。

图2

图2中1的位置appScreenLocation获取的是DecorView在整个屏幕的位置(x:0,y:0);2的位置screenLocation获取的是要显示PopupWindow的view在屏幕中的位置(view.x,view.y);3的位置drawingLocation获取的是开始绘制的位置(和screenLocation一致);4的位置outParams.x和outParams.y获取的是popupWindow显示的位置。5的位置由于height设置成MATCH_PARENT,所以导致outParams.height等于屏幕的高度。我们继续沿着方法查看:

图3

在图3中正是由于height的高度是屏幕的高度从而不满足height<=spaceBelow,只能继续向下走:

图4

在图4中我们发现最后outParams.y被调整到outParams.y=0;至此导致整个PopupWindow的显示覆盖了view,在屏幕顶部显示。

发现了问题所在,那么我们又如何解决呢?

既然是在positionInDisplayVertical方法中调整outParmas.y导致的,那么我们不走这个方法不就可以了吗?为此我们重新回到图3中

图3.2

在图3.2中我们发现只要在1或2出返回即可,随后可以看到在2中判断的是popupWindow的高度和view在y轴上的位置,在大多数情况下不满足,所以在1处做文章保证height<=spaceBelow就可以了,所以popupWindow的最大高度应该是屏幕的高度-view的高度。

解决办法如下:

1、当setHeight(MATCH_PARENT)时在showAsDropDown方法中重新设置下高度即可(比较适用于有统一处理的PopupWindow)

2、在setHeight时不在设置成MATCH_PARENT,而设置成setHeight(context.getResources().getDisplayMetrics().heightPixels - anchor.getHeight())

相关文章

网友评论

      本文标题:7.0以上PopupWindow显示问题解析

      本文链接:https://www.haomeiwen.com/subject/nflszftx.html