android:为啥“layout_weight = 1”使视图在线性布局中对齐父底部? [复制]

Posted

技术标签:

【中文标题】android:为啥“layout_weight = 1”使视图在线性布局中对齐父底部? [复制]【英文标题】:android:Why "layout_weight=1" makes the view align parent bottom in linearlayout? [duplicate]android:为什么“layout_weight = 1”使视图在线性布局中对齐父底部? [复制] 【发布时间】:2016-11-12 22:12:27 【问题描述】:

xml布局是这样的:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:orientation="vertical"
        >
        <LinearLayout
            android:layout_
            android:layout_
            android:layout_weight="1">
        </LinearLayout>
        <TextView
            android:layout_
            android:layout_
            android:text="bottom"/>
    </LinearLayout>

事实证明,textview 将被放置在其父级的底部。我认为 layout_weight 用于分配未使用的空间,并且将 layout_weight 与以下代码一起使用是很常见的:

    android:layout_

但在这种情况下,第一个布局要求占用所有空间:

    android:layout_
    android:layout_comcopy">当你使用 layout_weight 时,在水平方向上设置 layout_widht = '0dp',在垂直方向上设置 layout_height='0dp'
                
              
                
                        
            
        
    

            

 
             
            【参考方案1】: 
                

    
    

当您使用layout_weight 属性时,它用于计算单亲的子视图的权重。

由于您没有提到所有其他视图的权重,它的行为是错误的。

layout_weight 在您希望子视图占父视图的一定百分比时很有用。

例如,

在父视图中您需要提及:

android:weightSum="1"

因此,您的父视图的总权重为 1,并且在两个视图中您都需要提及:

android:layout_weight=".9"android:layout_weight=".1"

所以第一个视图将占用 90% 的空间,第二个视图将占用 10% 的空间。

为了更清楚,理想情况下,所有孩子的权重总和应该等于父母中提到的weightsum,这样才能按预期工作。

**正如你提供的android:layout_width,android:layout_height`的textview,这是错误的,因为它会在重量上产生问题。

所以要正确使用权重属性,您需要将其他规范指定为0dp,以便权重成功应用。**

注意:当您使用重量时,其他规格如android:layout_width, android:layout_height 应设置为0dp

要实际理解它,你为什么不玩弄下面 布局:

只需尝试更改 linear_layout、text_view 的权重,您就会看到它应该如何理想地工作:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:weightSum="100" >

    <LinearLayout
        android:id="@+id/linear_layout"
        android:layout_
        android:layout_
        android:layout_weight="10"
        android:background="@android:color/holo_blue_bright" >
    </LinearLayout>

    <TextView
        android:id="@+id/text_view"
        android:layout_
        android:layout_
        android:layout_weight="90"
        android:background="@android:color/white"
        android:text="bottom"
        android:textColor="@android:color/black" />

</LinearLayout>

【讨论】:

感谢回答。我了解layout_weight的常见用法。我一开始打算做的是将textview放在一个linearlayout的底部。我在问题中发布的布局可以实现这个目标。我只是想知道是否有人可以解释它是如何工作的。 我试图解释错误,请在答案中阅读它,如果您仍有任何疑问,请告诉我,我很乐意为您提供帮助!干杯。【参考方案2】:

如果您想将组件放置在布局中的单独框中,您应该使用LinearLayout。 您可以使用orientation垂直水平定义盒子放置方式。 您可以使用layout_weight 轻松定义它们的大小。 看这里:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:id=@+id/parent_linear>

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="4">
    </LinearLayout>
    <TextView
        android:layout_
        android:layout_
        android:layout_weight="2"
        android:text="bottom"/>
</LinearLayout>

parent_linear 将您的布局垂直分成两部分(因为您使用 2 个组件)。现在您可以将权重设置为子组件的宽度。所以,(对于 TextView)你设置了 android:layout_width="0dp" 的宽度和 android:layout_weight="2" ..跟随它的 LinearLayout- 。 这样做的结果是 parent_layout 将自己分成 6 个部分(2+4=6),并为 LinearLayout 分配 4 个部分,为 TextView 分配 2 个部分。

【讨论】:

以上是关于android:为啥“layout_weight = 1”使视图在线性布局中对齐父底部? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Android开发工程师文集-layout_weight讲解

Android 动态 设置layout_weight

[Android] android:layout_weight 属性的工作原理

android:layout_weight的真实含义

android:layout_weight

(android筑基系列)之LinearLayout适配问题(android:layout_weight属性)