Framework

Android UI疑难杂症(一)

2022-08-02  本文已影响0人  在岁月中远行

问题:RelativeLayout中最底的View其layout_marginBottom无效

我们先看一个现象:

RelativeLayout 最下面是一个Button,设置了属性android:layout_marginBottom="118dp",在安卓API16的手机上运行效果这个属性是失效的。

而在安卓API22确实正常的(其实API19以上都是生效的) ,下面我们来分析原因

我们可以从android fraework源码里寻找答案:

在RelativeLayout的onMeasure中有这么一段代码:

当RelativeLayout高度是android:layout_height="wrap_content"时候,并且SDk版本小于API19时候,计算高度时候并没有把此View的bottomMargin计算进去。

height = Math.max(height, params.mBottom); 

height取的就是最下面View的mBottom值作为height,并未计算最后一个View的margub_bottom。

RelativeLayout的height就是不断的遍历子View,然后拿height和params.mBottom取最大值,越位于下方的View,mBottom肯定是越大的(可以参考android坐标系),就这样计算出了RelativeLayout的高度,最后调用方法

解决办法:当我们加上一段代码 如左图所示:在RelativeLayout添加加上一个View,效果如右图所示生效了:

原因就是RelativeLayout计算高度时候,拿最后一个View的layoutParams的mBottom作为高度,最后的View的mBottom肯定是包含android:layout_marginBottom="118dp"生效代码的,所以最后计算出RelativeLayout的height肯定是正确的。

上一篇 下一篇

猜你喜欢

热点阅读