Android面试中的一个常见问题:Layout_weight的用法

今天在公司第一次去当了回面试官,挺带劲的啦,发现那位面试的小伙做的卷子里有道关于layout_weight的问题,感觉答得不是很好,遂想写个博客(其实是想要记录下这有意思的事,好久没写博客了,看完记得点赞哦),总结了以下几个小点,帮助大家理解哈。

一、如果把每个layout_width设为0dp,layout_weight设为1,会出现什么问题呢?
首先我先在XML中写个布局文件,代码如下:
Android面试中的一个常见问题:Layout_weight的用法_第1张图片

运行效果如下:

那么问题来了:虽然layout_weight是有效果了,但是为什么三个TextView没有对齐呢?
问题解析:其实三个控件间是对齐了的,只是以当中的内容对齐。这当中的问题是在父容器中存在一个android:baselineAligned = “true”,所以我们应当把它设为false。
修改代码如下:
Android面试中的一个常见问题:Layout_weight的用法_第2张图片
最终效果如下:
代码片段4

二、如果把第一个layout_width设为wrap_content,又设置了每个控件的layout_weight的权值,那么布局会如何分配宽度呢?
代码如下:

运行的效果如下:
代码片段6

layout_weight分配的算法是:LinearLayout中的layout_weight属性,首先按照控件声明的尺寸进行分配,然后再将剩下的尺寸按weight分配

三、如果把每个layout_width设为match_parent之后,也配置了layout_weight,那么又是如何分配宽度的?
代码如下:
Android面试中的一个常见问题:Layout_weight的用法_第3张图片

运行效果如下:

那么问题又来了:发现第一个TextView反而比其他两个权值更大的控件宽度更大呢?

分析:根据上面总结的分配规则,首先减去控件声明的尺寸,父控件剩余的尺寸按比例分配。假设屏幕的宽度是720,那么很明显三个控件的宽度都是match_parent是不够分的,此时分配完控件声明的尺寸后,父控件剩余的宽度就为负数了,父控件剩余宽度rest = 720 - 720 * 3 = -720 * 2,接着就把剩余的宽度按layout_weight声明的比例分配。下面就来具体计算各个控件的宽度:
(1)那么就来计算第一个控件实际所分配的控件宽度:layout_width + 父控件剩余的宽度比例 –> 720 + (-720*2)/5 = 720 * (3/5)
(2)TextView2和TextView3的权值都是2,实际所分配的宽度大小就是:720 + (-720 * 2)/(2/5)= 720 * (1/5)

由此可见:上面所说的layout_weight宽度分配规则是正确的,控件宽度 + 父控件剩余宽度 * weight比例。

下面我再说下可以和layout_weight结合的一个属性layoutSum,实现一个很有意思功能。
场景:假设只有一个控件,但是又想按比例分配宽度,怎么解决?

问题分析:此时就缺少其他控件进行比例的划分;
解决方案:虽然只有一个控件,但可以在父布局中定义总的权值,这样子控件就可以有权值的比例了。
实现代码如下:

四、不知道大家有没发现XML中有些属性是以layout开头,像layout_gravity什么的,而有些属性则没有layout开头,这有什么不同呢?
问题分析:layout的意思是布局,layout开头的属性实际上是说这些属性由其父容器去获取,再去设置。而没有以layout开头的属性,就是由控件自己获取设置。
总结一句话就是:Layout_开头都是交给父容器,没有Layout_开头都是本身的属性。

你可能感兴趣的:(Android开发,布局问题,littleRich,四川无声信息技术有限)