android:height和android:layout_height有什么区别?

39
<TextView
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:paddingTop="48dp"
    android:text="Test"
    />
我期望 TextView 的测量高度为 96dp,无论“Test”占用多少空间(高度方面)(期望它截断)。
相反,我得到了完整的“Test”+48dp的填充。
我可以放置任何有效值 layout_height 并获得相同的结果。
为了获得我的 96dp 高度,我需要:
<TextView
    android:layout_width="match_parent"
    android:layout_height="<any valid value>"
    android:height="48dp"
    android:paddingTop="48dp"
    android:text="Test"
    />

在这里,我可以将layout_height设置为任何有效值(但它作为必需属性需要存在)。

我从未在XML中使用过height属性,但是我在文档中找不到它们之间的区别,特别是当元素也具有为填充和/或边距设置的值时,每个属性如何计算。

是否有任何可用的资源来讨论它,或者有人可以在这里解释一下吗?


编辑(问题总结):

可能是我使用它的情况引起了问题,因此可以忽略我上面的示例(我在一个新项目中尝试并获得与属性组合不同的结果)。

但是我的原始问题仍然适用(有些重叠):

  1. 它们之间有什么区别?
  2. 应该何时使用其中之一?
  3. 一种的使用会影响另一种的使用吗?
  4. 一种的使用是否对其他可以控制视图测量维度的属性(如填充或边距)产生影响?

编辑2(附言):

如果它有助于理解我的初始情况与新项目的情况:

我有一个Activity,它将windowActionBarOverlay设置为true,因此我的内容可以在(半透明)ActionBar下面流动。

我还使用Croutons,这些Croutons现在出现在ActionBar下面。Ben Weiss建议我将Crouton附加到不同的ViewGroup上,但是我不确定应该将其附加到哪个ViewGroup上。

相反,我提供了一个自定义视图(当需要时进行膨胀),作为Crouton(第一部分问题中的TextView),并具有等于ActionBar顶部填充的顶部填充,因此现在它以垂直方式正常显示在ActionBar下面(有关其他问题,请参见另一天)。


有人能建议一下我如何改进这个问题,使得它不会招致匿名的负评吗? - ataulm
1
这里有一个类似的问题: http://stackoverflow.com/questions/18091531/what-is-use-of-androidheight-attribute-despite-having-androidlayout-height - Prince
谢谢@Prince,我已经根据这个投票关闭了...编辑:即使你的是之后的。显然我的是“太长不看” :P - ataulm
如果搜索“android layout_height vs height”,谷歌会首先找到这个问题。此外,这个问题已经一个月了。现在这个问题有了详尽的答案。因此,如果有什么需要关闭另一个问题。 - Martin
4个回答

28

(什么是它们之间的区别?):

所有以“layout_”开头的属性均为 ViewGroup 的提示,指出此 View 属于哪个 ViewGroup。每个 android.view.ViewGroup 都有一组 LayoutParams。但小部件本身并不使用它们。

android:height 参数是 android.view.View 的初始大小。但如果该 View 是 ViewGroup 的一部分,则 ViewGroup 将根据其布局规则调整对象的大小。

顺便说一下:新的 API 有一个新的 android:minHeightandroid:maxHeight 属性,以澄清程序员的意图。

请注意,如果您不设置 android:height,则视图将自行计算大小。大多数情况下,这是正确的做法。

(何时应优先使用其中之一?):

ViewGroup 是抽象类——答案取决于您正在使用哪个实际的子类。

请注意,WRAP_CONTENT 告诉 ViewGroup 使用 android:height。这意味着在您的示例中应使用此参数。

(使用其中一个是否会影响另一个的使用?):

是的——并递归地如此。TableLayout 将读取和写入 android:width 属性,以查找最宽的对象并将所有其他对象调整为其大小。

(使用android中的padding属性是否会对其他可以控制视图测量维度的属性产生影响,例如padding或margin?)

不会对android:padding产生影响,但会对android:layout_margin产生影响。请注意,边距是布局参数,并非每个布局管理器都支持边距。

有关详情,请参见边距 vs 填充

最后的话:

更容易地考虑所有宽度和高度属性仅为提示而已。对象大小的最终决定权在于所使用的ViewGroup的布局管理器。


0

android:height 可以使视图的高度精确地达到指定像素数,而 android:layout_height 则指定视图的基本高度。


实际上:更多的是相反的情况。 - Martin

0

嗯,android_layout:height 指定了 VIEW 的基本高度,而 android:height 则指定了对象的高度(例如 xml 中的按钮)。

祝你好运!:)


不完全是android_layout:height不是视图的一部分。它告诉父级android.view.ViewGroup你想要什么大小。 - Martin

0
从我的实验中得出的结论是,layout_height是灵活的——它有一个首选高度,但仍然可以随内容的变化而展开/缩小,而height则是一个确定的数值。
在你的情况下,TextView正在围绕着“Test”文本进行包裹,但仍然使用48dp的paddingTop属性。

是的。但是一些 android.view.ViewGroup 可能会自己设置高度。这完全取决于所使用的布局策略。 - Martin

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