ChatGPT解决这个技术问题 Extra ChatGPT

android:layout_weight 是什么意思?

我不明白如何使用这个属性。谁能告诉我更多关于它的信息?


O
OneCricketeer

使用 layout_weight,您可以指定多个视图之间的大小比率。例如,您有一个 MapView 和一个 table,它们应该向地图显示一些附加信息。地图应占屏幕的 3/4,表格应占屏幕的 1/4。然后将 maplayout_weight 设置为 3,将 tablelayout_weight 设置为 1。

要让它工作,您还必须将高度或宽度(取决于您的方向)设置为 0px。


挠头,直到你提到 0px 高度!
定义其中哪些会受到重量的影响。宽度或高度。
你确实需要 0px。示例:您想实现一个包含两个大小相同的列的表。每个表格行都是一个水平线性布局,有两个“表格单元格”(例如,TextViews),每个单元格的 layout_weight=.5。如果在“表格单元格”上指定 layout_width="wrap_content",则内容宽度将添加到由 layout_weight 计算的宽度上,表格单元格将大小不一,列将无法正确排列。所以你必须设置 layout_width=0dp 以便 android 只使用 layout_weight 来计算单元格的宽度。
@Solace,迟到的答案,但为了完整起见..似乎 weight 属性对RelativeLayout没有贡献。它仅适用于线性布局。如果您看到需要权重,也许要走的路是在 RelativeLayout 中创建一个 LinearLayout(带有权重)。
为了更好地理解,您可以想象百分比分布。意味着您有 3 个按钮,其中一个占据屏幕的一半,另外两个占据屏幕的后半部分。然后您可以像这样设置权重:50, 25, 25
A
ArK

简而言之,layout_weight 指定布局中要分配给视图的额外空间量。

LinearLayout 支持为单个子级分配权重。此属性为视图分配“重要性”值,并允许其扩展以填充父视图中的任何剩余空间。视图的默认权重为零。

计算以分配孩子之间的任何剩余空间

一般来说,公式是:

分配给孩子的空间=(孩子的个人体重)/(线性布局中每个孩子的体重总和)

示例 1

如果有三个文本框,其中两个声明权重为 1,而第三个没有权重 (0),则剩余空间分配如下:

第一个文本框 = 1/(1+1+0) 第二个文本框 = 1/(1+1+0) 第三个文本框 = 0/(1+1+0)

示例 2

假设我们在水平行中有一个文本标签和两个文本编辑元素。该标签没有指定 layout_weight,因此它占用了渲染所需的最小空间。如果两个文本编辑元素中的每一个的 layout_weight 都设置为 1,则父布局中剩余的宽度将在它们之间平均分配(因为我们声称它们同样重要)。

计算:

第一个标签 = 0/(0+1+1) 第二个文本框 = 1/(0+1+1) 第三个文本框 = 1/(0+1+1)

相反,如果第一个文本框的 layout_weight 为 1,第二个文本框的 layout_weight 为 2,则剩余空间的三分之一将分配给第一个,三分之二分配给第二个(因为我们声称第二个更重要)。

计算:

第一个标签 = 0/(0+1+2) 第二个文本框 = 1/(0+1+2) 第三个文本框 = 2/(0+1+2)

Source article


比当前选择的答案更好的解释。
嗯,有简单的解释(我很欣赏)和细节(我以不同的方式欣赏)。他们都是很好的答案。
如其他地方所述,android:layout_width="0px" 很重要。此外,权重不需要是整数。
这比选择的答案更难理解,但它给出了完整的答案——特别是当一些视图有权重而一些没有权重时。这是所选答案未涵盖的巨大用例。
我不同意这很难理解。恰恰相反,他让我们知道他们为什么称它为 WEIGHT。因为它意味着重要性。正如他所说的那样有很大的分量。我也不同意第一个答案简单而中肯。答案仍然让我摸不着头脑,完全不知道该属性的作用。这个答案是金。我现在已经站稳了脚跟。
O
OneCricketeer

添加到其他答案中,最重要的是将布局宽度(或高度)设置为 0px

android:layout_width="0px"

否则你会看到垃圾


我认为这取决于您是要隐藏未定义其权重的视图,还是要以适合大小的尺寸显示它们并将剩余的可用空间留给“加权”视图。
C
Community

如果有多个跨越 LinearLayout 的视图,则 layout_weight 会为每个视图提供一个成比例的大小。具有较大 layout_weight 值的视图“权重”更多,因此它获得了更大的空间。

这是一张让事情更清楚的图像。

https://i.stack.imgur.com/CyYBf.png

理论

术语布局权重与数学中的 weighted average 概念有关。就像在大学课堂上,家庭作业占 30%,出勤占 10%,期中占 20%,期末占 40%。你在这些部分的分数,当加权在一起时,给你你的总成绩。

https://i.stack.imgur.com/cbfgn.png

布局权重也是一样。水平 LinearLayout 中的 Views 可以分别占据总宽度的一定百分比。 (或垂直 LinearLayout 的高度百分比。)

布局

您使用的 LinearLayout 如下所示:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

请注意,您必须将 layout_width="match_parent" 用于 LinearLayout。如果您使用 wrap_content,那么它将不起作用。另请注意,layout_weight 不适用于 RelativeLayouts 中的视图(有关处理此问题的 SO 答案,请参阅 herehere)。

观点

水平 LinearLayout 中的每个视图如下所示:

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

请注意,您需要将 layout_width="0dp"layout_weight="1" 一起使用。忘记这一点会导致许多新用户出现问题。 (请参阅 this article 了解通过不将宽度设置为 0 可以获得的不同结果。)如果您的视图位于 vertical LinearLayout 中,那么您当然会使用 layout_height="0dp"

在上面的 Button 示例中,我将权重设置为 1,但您可以使用任何数字。只有总数才重要。您可以在我发布的第一张图片中的三行按钮中看到,数字都不同,但由于比例相同,因此每行的加权宽度不会改变。有些人喜欢使用总和为 1 的十进制数,以便在复杂的布局中清楚每个部分的重量是多少。

最后一点。如果您有大量使用 layout_weight 的嵌套布局,则可能不利于性能。

额外的

这是顶部图像的 xml 布局:

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="2" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

我总是想知道为什么更多的人不发布图像来伴随他们的 XML。视觉效果比代码更容易理解。
T
Tash Pemhiwa

layout_weight 告诉 Android 如何在 LinearLayout 中分发您的 View。然后,Android 首先计算所有具有指定权重的 View 所需的总比例,并根据它指定的屏幕比例放置每个 View。在以下示例中,Android 发现 TextViewlayout_weight0(这是默认设置),而 EditTextlayout_weight 分别为 2,而 Button权重为 1。因此,Android 分配“刚好足够”的空间来显示 tvUsernametvPassword,然后将屏幕宽度的其余部分分成 5 个相等的部分,其中两个分配给 etUsername,两个分配给 etPassword,最后一部分bLogin

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

https://i.stack.imgur.com/C3DbM.png


G
George Nguyen

这么想,会更简单

如果您有 3 个按钮并且它们的权重相应地为 1,3,1,它将像 HTML 中的表格一样工作

为该行提供 5 部分:按钮 1 的 1 部分、按钮 2 的 3 部分和按钮 1 的 1 部分

看待,


C
Community

对我来说最好的解释之一是 this one (from the Android tutorial, look for step 7)

layout_weight 在 LinearLayouts 中用于为布局中的视图分配“重要性”。所有视图的默认 layout_weight 为零,这意味着它们只占用屏幕上需要显示的空间。根据每个 View 的 layout_weight 值及其与当前布局中为该元素和其他 View 元素指定的整体 layout_weight 的比率,分配大于零的值将拆分父 View 中剩余的可用空间。举个例子:假设我们在水平行中有一个文本标签和两个文本编辑元素。该标签没有指定 layout_weight,因此它占用了渲染所需的最小空间。如果将两个文本编辑元素中的每一个的 layout_weight 设置为 1,则父布局中的剩余宽度将在它们之间平均分配(因为我们声称它们同样重要)。如果第一个的 layout_weight 为 1,第二个的 layout_weight 为 2,则剩余空间的三分之一将分配给第一个,三分之二分配给第二个(因为我们声称第二个更重要)。


V
Vladimir Ivanov

http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout

layout_weight 定义了控件必须分别获得多少空间给其他控件。


A
Alen Lee

追加:

对于 vertical 方向,不要忘记将 height 设置为 0dp

android:layout_height="0dp"

对于 horizontal 方向,不要忘记将 width 设置为 0dp

android:layout_width="0dp"

O
OneCricketeer

请看LinearLayout的weightSum和每个View的layout_weight。 android:weightSum="4" android:layout_weight="2" android:layout_weight="2" 他们的layout_height都是0px,但我不确定它是否相关

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>

请看LinearLayout的weightSum和每个View的layout_weight。 android:weightSum="4" android:layout_weight="2" android:layout_weight="2" 他们的 layout_height 都是 0px,但我不确定它是否相关。
A
Andrii Kalytiiuk

结合两个答案

Flo & rptwsthi 和 roetzi,

请记住更改您的 layout_width=0dp/px,否则 layout_weight 的行为会相反,最大的数字占用最小的空间,最小的数字占用最大的空间。

此外,某些权重组合会导致某些布局无法显示(因为它过度占用空间)。

谨防这一点。


s
skryshtafovych

添加 android:autoSizeTextType="uniform" 将自动为您调整文本大小


n
naXa stands with Ukraine

顾名思义,布局权重指定特定字段或小部件应占据屏幕空间的空间量或百分比。
如果我们在水平方向指定权重,则必须指定 layout_width = 0px
同样,如果我们指定垂直方向的权重,然后我们必须指定 layout_height = 0px