问题: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肯定是正确的。
网友评论