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

这个属性可能对于初学者来说比较头疼,也是一道比较经典的Android面试题,这不,最近在公司面了好几个来面试Android工作的人,发现好几个面试者做的卷子里有道关于layout_weight的问题,感觉答得不是很好,遂想写个博客(其实是想要记录下这有意思的事,好久没写博客了,看完记得点赞哦),总结了以下几个小点,帮助大家理解哈。

一、如果把每个layout_width设为0dp,layout_weight设为1,会出现什么问题呢?
首先我先在XML中写个布局文件,代码如下:
代码片段1

运行效果如下:
代码片段2

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

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

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

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

三、如果把每个layout_width设为match_parent之后,也配置了layout_weight,那么又是如何分配宽度的?
代码如下:
代码片段7

运行效果如下:
代码片段8

那么问题又来了:发现第一个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,实现一个很有意思功能。
场景:假设只有一个控件,但是又想按比例分配宽度,怎么解决?
代码片段9

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

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

更多技术干货,欢迎到我的个人博客http://littleRich.top/
获取开源项目GitHub:http://github.com/littleRich/

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值