Android中fill_parent与match_parent的区别
今天在下载一demo时,发现里面layout都使用的是fill_parent,而我之前一直用的都是match_parent,应该大多数朋友在开发时使用的是match_parent,那么他们之间有什么不同?带着这个问题我去读了Android的源码。结果我发现,他们就是一个东西。然后我就看了下资料,发现在Android2.2以后,Android将所有的fill_parent通过映射变为match_parent,而在Android2.2之前是没有match_parent方法的。所以说他们本质上其实就是一个东西。
下面就是源码里比较他们之间的关系:
public static int getChildMeasureSpec(int spec, int padding, int childDimension) {
...
//根据当前选择的Mode做相应处理
switch (specMode) {
case MeasureSpec.EXACTLY:
//若childDimension = wrap_content。size赋予测出的大小,mode设置为AT_MOST。
//根据childDimension获取子view对应的MeasureSpec。
if (childDimension >= 0) {
//有具体值,布局具体到具体值。
resultSize = childDimension;
resultMode = MeasureSpec.EXACTLY;
} else if (childDimension == LayoutParams.MATCH_PARENT) {
// match_parent,就把父控件的大小赋值给子view,并且mode设置为精确的大小EXACTLY。
resultSize = size;
resultMode = MeasureSpec.EXACTLY;
} else if (childDimension == LayoutParams.WRAP_CONTENT) {
// wrap_content,那么父控件的值赋予子控件,mode设置为AT_MOST,最大不能超过这个设置的数值。
resultSize = size;
resultMode = MeasureSpec.AT_MOST;
}
break;
case MeasureSpec.AT_MOST:
...
break
...
}
//将上面测量好的 MeasureSpec(包含resultSize以及resultMode)值返回。
return MeasureSpec.makeMeasureSpec(resultSize, resultMode);
}
可以看到,源码中只有match_parent和wrap_content两种情况,并只对这两种情况做了处理,并没有发现fill_parent。其实是android2.2之后就是把fill_parent改名为了match_panrent。所以他们的效果是一样的。
最后贴出在SDK中的描述:
(1)fill_parent -1 The view should be as big as its parent (minus padding). This constant is deprecated starting from API Level 8 and is replaced by match_parent.
(2)match_parent -1 The view should be as big as its parent (minus padding). Introduced in API Level 8.
(3)wrap_content -2 The view should be only big enough to enclose its content (plus padding).