match_parent和fill_parent有什么区别?

1471

我对两个XML属性有点困惑:match_parentfill_parent。它们似乎是相同的,它们之间有什么区别吗?


请返回仅翻译的文本:https://developer.android.com/reference/android/view/ViewGroup.LayoutParams - Shomu
17个回答

1273

它们是相同的东西(API 8+中),请使用match_parent

FILL_PARENT(在API级别8及更高版本中重命名为MATCH_PARENT),表示视图要尽可能大,与其父对象一样大(减去填充)

...

fill_parent: 视图应该与其父对象一样大(减去填充)。此常量从API级别8开始已被弃用,并被match_parent所取代。

http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html


6
如果我为1.6和2.2编写应用程序,我将使用fill_parent以确保兼容性,这样做是正确的吗? - emeraldhieu
14
肯定会有一些差异,否则为什么谷歌会弃用原来的产品并且给新产品改名呢? - stuckedoverflow
53
@Halim 不,它们没有区别:两者都被定义为常量“-1”。 如果你感觉更好一些,我也不太理解其中的改进... :-) - arpy
3
@jlovison 不,它们没有区别。两者都是“-1”。您会收到错误,因为旧平台不知道完全相同常量的新名称。 - J.G.Sebring
19
Android Studio 在所有默认模板创建的布局中仍然使用 "fill_parent",这真是太奇怪了!我知道它们是一样的,但我每年都会回到这个 Stack Overflow 的问题上来确保没有人发现它们之间真的有差异。能否请 Google/Android 团队将默认值从 "fill_parent" 改为 "match_parent"?提前谢谢! :) - swooby
显示剩余2条评论

260

为避免混淆,Google更改了名称。

原来的名称fill parent存在问题,因为它暗示着它会影响父元素的尺寸,而更好的描述实际行为的是match parent - 与父元素匹配尺寸。

两个常量最终都解析为-1,因此在应用程序中具有相同的行为。讽刺的是,这次旨在澄清事情的名称更改似乎增加了混淆,而不是消除它。


18
除RelativeLayout的子项宽度为match_parent且位于另一个子项左侧之外,它不会匹配其父项的尺寸,而是填充其中剩余的空间。这只会导致混淆。 - kaay
7
FILL_PARENT和MATCH_PARENT的意思是视图想要与其父视图一样大,减去父视图的padding后的空间是内部空间而不是外部尺寸?现在我更加困惑了! 作为FILL_PARENT和MATCH_PARENT的意思是视图想要与其父视图一样大,但是在考虑父视图的padding时,它们所占据的空间是父视图的内部空间而不是外部尺寸。现在我更加困惑了! - Caltor
@bnieland 我已经删除了内部和外部尺寸的引用,因为它们与Google文档不一致,详见http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#FILL_PARENT。虽然我可以在http://sevennet.org/2014/11/22/how-to-what-is-the-difference-between-match_parent-and-fill_parent/看到类似(未经证实的)引用,这可能是您获取信息的地方。 - Caltor

31

功能上没有区别,Google只是在API级别8(Android 2.2)中将名称从fill_parent更改为match_parent。FILL_PARENT仍然可用于兼容性原因。

LayoutParams.FILL_PARENTLayoutParams.MATCH_PARENT都具有值-1。不确定是什么引诱谷歌从Fill Parent更改为Match Parent:)

由于大多数手机的Android版本都是>= 2.2,因此应该使用Match Parent以实现未来的兼容性...不确定他们何时会停止使用旧的Fill Parent常量!


11

FILL_PARENT 在API级别8中已过时,建议使用更高级别的API替代MATCH_PARENT


10

match_parent 用来替代 fill_parent,并将其设置为与父元素一样大小。只需使用match_parent,不再考虑fill_parent。我完全摒弃了fill_parent,现在一切都和往常一样完美。

点击这里了解更多。


7

两者具有相似的功能,唯一的区别在于fill_parent用于API级别8及以下,而match_parent用于API级别8或更高级别。


7
当您将布局的widthheight设置为match_parent时,它将占用父视图拥有的完整区域,即它将与父视图一样大。这是在XML属性中设置的。
<LinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="#f9b0b0">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#b0f9dc"/>

</LinearLayout>

母元素为红色,子元素为绿色。子元素占据全部区域,因为它的 widthheight 属性值均为 match_parent

enter image description here

注意:如果父元素应用了填充,则该空间不会被包括在内。
<LinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="#f9b0b0"
    android:paddingTop="20dp"
    android:paddingBottom="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#b0f9dc"/>

</LinearLayout>

enter image description here

所以TextView的高度=300dp(父容器高度)-(20(paddingTop)+ 10(paddingBottom)) =(300-30)dp = 270 dp

fill_parent Vs match_parent

fill_parentmatch_parent的旧名称

对于API Level 8及更高版本,fill_parent被重命名为match_parent,并且fill_parent现在已弃用。

因此,fill_parentmatch_parent是相同的。

fill_parent的API文档

视图应该与其父容器一样大(减去填充)。 从API Level 8开始,此常量已过时,并被{@code match_parent}替换。


6

为了更贴切地描述其实际作用"fill_parent"并不能像其名称所暗示的那样填充剩余空间(对于这个目的,您需要使用weight属性)。相反,它会占用与其布局父级相同的空间。这就是为什么新名称是"match_parent"


2
当人们说“父元素有填充”或“子元素在另一个元素的左侧”时,我不理解他们的逻辑。难道子元素匹配它吗?不是的。它填充剩余的空间吗?在这个显然是Bizzarro World的地方,我们的答案是:是的。 - kaay
1
@kaay 我完全同意新名称比旧名称更糟糕。但是Google说了算。 - Caltor

4

match_parent表示视图希望与其父视图一样大(减去填充)。

wrap_content表示视图希望仅足够大以容纳其内容(加上填充)。

为了更好地说明这个概念,我创建了一个示例布局来演示它的效果。为了看到它的效果,我添加了每个textView内容的边框。

在“Match parent”textView内容中,我们可以看到它的布局宽度超出了其父视图的整个长度。

但是在“Wrap Content”textView内容中,我们可以看到它的布局宽度包裹着其内容(Wrap Content)的长度。

Android Layout


这个问题是关于match_parent(你已经讲过了)和fill_parent(你没有提到)之间的区别。你相反地将其与wrap_content进行了比较,而问题并没有询问它。 - Jeremy Caney

4

fill_parent:视图应该和其父视图一样大。

现在这个 fill_parent 属性已过时,被 match_parent 属性所取代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接