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=horizontalwidth=match_parent(它就在根布局内)。但是两个 TextView 都显示在 LinearLayout 的左侧,尽管我分别给出了它们的 layout_gravity=centerlayout_gravity=right

【问题讨论】:

它不起作用,因为 Textview 的布局绑定到 wrap_content 而不是 match_parent 线性布局不是你想要的。您应该使用相对布局。为什么不想使用相对布局? LinearLayout 中的layout_gravity 只能更改垂直于方向的对象位置。如果方向是水平的,您可以指定顶部和底部,而不是左右。 @chitti :但我已经看到 layout_gravity=bottom 在垂直线性布局中工作。 @Ashwin 您可能需要再次检查。您可能已经看到线性布局工作的重力 = 底部。 【参考方案1】:

简答:如果你有一个水平线性布局,那么每个子级只能有layout_gravitytopbottomcenter

这样做的原因是因为您已经告诉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 &amp;  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 在水平线性布局中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

LinearLayout布局问题

线性布局LinearLayout的那些事儿

Android学习笔记-----------布局

ScrollView 在我的相对布局中不起作用

Android零基础入门第26节:layout_gravity和gravity大不同

LinearLayout(线性布局)