layout_gravity 在水平线性布局中不起作用
Posted
技术标签:
【中文标题】layout_gravity 在水平线性布局中不起作用【英文标题】:layout_gravity not working in horizontal linear layout 【发布时间】:2016-01-09 15:11:08 【问题描述】:我一直在尝试在水平的linear layout
中使用layout_gravity
。但这似乎不起作用。我不想使用relative layout
或任何其他布局。我想知道为什么它不适用于linear layout
。我之前在vertical
线性布局中使用过layout_gravity
,它的工作方式符合我的预期。
<LinearLayout
android:id="@+id/shata"
android:layout_
android:layout_
android:orientation="horizontal"
>
<TextView
android:id="@+id/title_textview"
android:layout_
android:layout_
android:layout_gravity="center"
android:textColor="@color/black"
android:text="shata1"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<TextView
android:id="@+id/map_imageview"
android:layout_
android:layout_
android:layout_gravity="right"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="shata2"/>
</LinearLayout>
如您所见,线性布局有orientation=horizontal
和width=match_parent
(它就在根布局内)。但是两个 TextView 都显示在 LinearLayout
的左侧,尽管我分别给出了它们的 layout_gravity=center
和 layout_gravity=right
。
【问题讨论】:
它不起作用,因为 Textview 的布局绑定到wrap_content
而不是 match_parent
线性布局不是你想要的。您应该使用相对布局。为什么不想使用相对布局?
LinearLayout 中的layout_gravity 只能更改垂直于方向的对象位置。如果方向是水平的,您可以指定顶部和底部,而不是左右。
@chitti :但我已经看到 layout_gravity=bottom 在垂直线性布局中工作。
@Ashwin 您可能需要再次检查。您可能已经看到线性布局工作的重力 = 底部。
【参考方案1】:
简答:如果你有一个水平线性布局,那么每个子级只能有layout_gravity
值top
、bottom
和center
。
这样做的原因是因为您已经告诉LinearLayout
按您指定的顺序水平对齐每个子元素,从左到右,这意味着它只允许您指定每个子元素的垂直对齐方式layout_gravity
参数,当您的 LinearLayout
是垂直时,则相反。
有一个很好的链接来解释各种重力是如何工作的here。
【讨论】:
一开始我也是这么想的。但是按照这个逻辑,垂直 LinearLayout 应该只取 left、right 和 center 的值。但是垂直布局也会对属性底部做出反应。 我很想看一个垂直响应bottom
的示例,因为据我了解,它不应该,它可能只是分配给其他孩子。
解释比回答好得多,这也清楚地反映在投票上:))【参考方案2】:
作为Matt Taylor's response 的补充,您可以使用layout_weight
属性指定布局内元素的大小比例。有关详细信息,请参阅此thread。
上面的代码会将水平空间分成三个相等的区域。
<LinearLayout
android:id="@+id/shata"
android:layout_
android:layout_
android:orientation="horizontal">
<TextView
android:layout_
android:layout_
android:layout_weight="1"/>
<TextView
android:layout_
android:layout_
android:layout_weight="1"/>
<TextView
android:layout_
android:layout_
android:layout_weight="1"/>
</LinearLayout>
所以在这个例子中
第一个元素看起来像layout_gravity="left"
第二个元素看起来像layout_gravity="center"
第三个元素看起来像layout_gravity="right"
【讨论】:
Thomas,您底部 TextView 的 layout_weight 缺少结束双引号(在 1 之后)。仅供参考。 实用性非常有限。因为如果你想在左边有两个元素(一个接一个),在右边有一个元素呢???【参考方案3】:您可以将布局分为 3 部分,然后在右侧部分放置“shata2”,在中间部分放置“shata1”,左侧部分放置透明视图。
<LinearLayout
android:id="@+id/shata"
android:layout_
android:layout_
android:orientation="horizontal">
<View
android:layout_
android:layout_
android:layout_weight="1"
/>
<TextView
android:id="@+id/title_textview"
android:layout_
android:layout_
android:layout_gravity="center|top"
android:layout_weight="1"
android:text="shata1"
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#111" />
<TextView
android:id="@+id/map_imageview"
android:layout_
android:layout_
android:layout_weight="1"
android:layout_gravity="right"
android:gravity="right"
android:text="shata2"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
但是在您的代码中,当您使用线性布局时,它只是将视图一个接一个地放置,而不关心布局的重力。 希望有用。
【讨论】:
【参考方案4】:如果你想让你的子视图居中,那么你只需要为孩子提供线性布局重力。在您的线性布局上设置以下内容:
android:gravity="center"
我希望你的问题是正确的。
【讨论】:
【参考方案5】:在水平线性布局中创建三个孩子的一种方法是(已测试):
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:weightSum="3"
android:layout_
android:layout_>
<TextView
android:layout_
android:layout_
android:layout_weight="1" />
<TextView
android:layout_
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:layout_/>
<TextView
android:layout_weight="1"
android:layout_
android:layout_
android:text="" />
【讨论】:
【参考方案6】:<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="horizontal">
<TextView
style="@style/Base.TextAppearance.AppCompat.Headline"
android:layout_
android:layout_
android:text="Blankets & Carpets" />
<ListView
android:layout_
android:layout_
android:id="@+id/list_home_feature"
android:layout_marginLeft="10dp"
android:layout_marginTop="30dp"
android:layout_marginRight="10dp">
</ListView>
</LinearLayout>
【讨论】:
以上是关于layout_gravity 在水平线性布局中不起作用的主要内容,如果未能解决你的问题,请参考以下文章