android:layout_weightはどういう意味ですか?


回答:


860

ではlayout_weight、複数のビュー間のサイズ比を指定できます。たとえば、地図に追加情報を表示するa MapViewとaがtableあります。マップは画面の3/4を使用し、テーブルは画面の1/4を使用する必要があります。次にlayout_weight、のmapを3に設定しlayout_weighttableを1に設定します。

これを機能させるには、(向きに応じて)高さまたは幅を0pxに設定する必要もあります。


208
高さ0pxについて言及するまで、頭をスクラッチします。
JohnnyLambada

24
それらのうちどれが重量の影響を受けるかを定義します。幅または高さ。
neteinstein 2014

30
0pxは必要です。例:2つの同じサイズの列を持つテーブルを実装するとします。各テーブル行は、2つの「テーブルセル」(たとえば、TextViews)を持つ水平線形レイアウトであり、それぞれにlayout_weight = .5があります。「テーブルセル」でlayout_width = "wrap_content"を指定すると、コンテンツの幅がlayout_weightによって計算された幅に追加され、テーブルセルはすべて異なるサイズになり、列が正しく整列しなくなります。したがって、layout_width = 0dpを設定して、androidがlayout_weightのみを使用してセルの幅を計算するようにする必要があります。
eeeeaaii 2014年

3
@Solace、遅い答えですが、完全を期すために.. weight属性はRelativeLayoutに貢献していないようです。LinearLayoutでのみ機能します。重みが必要な場合は、おそらくRelativeLayout内に(重み付けされた)LinearLayoutを作成する方法が考えられます。
bbv

1
layout_weightは線形レイアウトでのみ機能するか、すべてのビューグループで機能しますか。
meShakti 2017

247

一言で言えば、layout_weightビューに割り当てるレイアウトの追加スペースの量を指定します。

LinearLayoutは、個々の子への重みの割り当てをサポートしています。この属性は、「重要度」の値をビューに割り当て、親ビューの残りのスペースを埋めるように拡大できるようにします。ビューのデフォルトの重みはゼロです。

子の間の残りのスペースを割り当てる計算

一般に、式は次のとおりです。

子に割り当てられたスペース=(子の個々の重量)/(線形レイアウトのすべての子の重量の合計)

例1

3つのテキストボックスがあり、そのうちの2つが重み1を宣言し、3番目のテキストボックスには重みがない(0)場合、残りのスペースは次のように割り当てられます。

最初のテキストボックス= 1 /(1 + 1 + 0)

2番目のテキストボックス= 1 /(1 + 1 + 0)

3番目のテキストボックス= 0 /(1 + 1 + 0)

例2

横一列にテキストラベルと2つのテキスト編集要素があるとします。ラベルはlayout_weight指定されていないため、レンダリングに必要な最小スペースを占めます。場合はlayout_weight2つのテキスト編集の各要素のが1に設定されている(私たちは、彼らが等しく重要であると主張するので)、親のレイアウトの残りの幅は、それらの間で均等に分割されます。

計算:

1番目のラベル= 0 /(0 + 1 + 1)

2番目のテキストボックス= 1 /(0 + 1 + 1)

3番目のテキストボックス= 1 /(0 + 1 + 1)

代わりに、最初の1つのテキストボックスのa layout_weightが1で、2番目のテキストボックスのa layout_weightが2の場合、残りのスペースの3分の1が最初のスペースに、3分の2が2番目のスペースに割り当てられます(2番目のテキストボックスは1つはより重要です)。

計算:

1番目のラベル= 0 /(0 + 1 + 2)

2番目のテキストボックス= 1 /(0 + 1 + 2)

3番目のテキストボックス= 2 /(0 + 1 + 2)


ソース記事


19
現在選択されている回答よりもはるかに良い説明。
シェード

12
まあ、単純な説明(私は感謝します)と骨の粗い詳細(私は別の方法で感謝します)があります。どちらも良い答えです。
cbmanica

3
他で言及されているように、android:layout_width="0px"重要です。また、重みは整数である必要はありません。
ブライアンホワイト

これは選択した回答よりも理解するのが少し難しいですが、完全な回答を提供します-特に、いくつかのビューには重みがある場合とそうでない場合があります。これは、選択した回答ではカバーされていない巨大なユースケースです。
Acey 2014年

では、weightSumどこで絵を描くのでしょうか?何layout_weightか関係がありますか?
eRaisedToX 2017

72

他の答えに加えて、これを機能させるための最も重要なことは、レイアウトの幅(または高さ)を0pxに設定することです

android:layout_width="0px"

そうでなければ、ゴミが表示されます


重みを定義していないビューを非表示にするか、サイズに合わせたサイズで表示し、残りの空き領域を「重み付けされた」ビューに残すかは、状況によって異なると思います。
Andrea Leganza 2017

水平ウェイトと垂直ウェイトの両方を設定する必要がある場合はどうなりますか?
1919年

40

にまたがる複数のビューがある場合LinearLayoutlayout_weightそれぞれに比例したサイズを与えます。layout_weight値が大きいビューは「重み付け」が大きくなるため、スペースが大きくなります。

わかりやすくするための画像です。

ここに画像の説明を入力してください

理論

レイアウトの重みという用語は、数学における加重平均の概念に関連しています。それは、宿題が30%、出席率が10%、中期が20%、そして決勝が40%の大学クラスのようなものです。これらの部分のスコアを一緒に重み付けすると、総合成績が得られます。

ここに画像の説明を入力してください

レイアウトの重みについても同じです。Views横では、LinearLayout各総幅の一定割合を取ることができます。(または、垂直の高さのパーセンテージ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の回答については、ここここを参照してください)。

ビュー

水平方向の各ビューはLinearLayout次のようになります。

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

layout_width="0dp"一緒に使用する必要があることに注意してくださいlayout_weight="1"。これを忘れると、多くの新しいユーザーの問題が発生します。(幅を0に設定しないことで得られるさまざまな結果については、この記事を参照してください。)ビューが垂直方向 LinearLayoutにある場合はlayout_height="0dp"、もちろんを使用します。

Button上記の例では、重みを1に設定していますが、任意の数を使用できます。重要なのは合計だけです。最初に投稿した画像の3列のボタンで、数値がすべて異なっていますが、比率は同じであるため、各行で重み付けされた幅は変わりません。複雑なレイアウトで各パーツの重量が明確になるように、合計が1の10進数を使用することを好む人もいます。

最後に一言。を使用するネストされたレイアウトが多数ある場合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>

1
XMLに付随する画像を投稿しない人が増えているのはなぜだろうといつも思っています。コードよりビジュアルの方がはるかに簡単です。
AleksandrH

30

layout_weightAndroidのは、あなたの配布方法について説明しますViewsでLinearLayout。次に、Androidは最初に、View指定された重みを持つすべてのに必要な合計比率を計算し、必要なView画面のどの部分に応じてそれぞれを配置します。次の例では、Androidはことを認識TextViewsが有するlayout_weightのを0(デフォルト)とEditTextSが持っているlayout_weight2が、それぞれButtonの重量を有します1。そうアンドロイドディスプレイにちょうど十分'スペース割り当てtvUsernametvPassword、その後に割り当てられているそのうちの2つが5等分、に画面幅の残りの部分を分割しetUsername、2個の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>

それは次のようになります
横向き し、
縦向き


リンクはもう利用できません。他に良いリファレンスがある場合は、更新してください。
BinaryGuy 2015

16

そのように考えると、より簡単になります

ボタンが3つあり、その重みがそれに応じて1,3,1である場合、HTMLのテーブルのように機能します

その行に5つの部分を提供します。ボタン1に1つ、ボタン2に3つ、ボタン1に1つです。

よろしく、


10

私にとって最も良い説明の1つこれです(Androidチュートリアルから、ステップ7を探してください)

layout_weightはLinearLayoutsで使用され、レイアウト内のビューに「重要度」を割り当てます。すべてのビューのデフォルトのlayout_weightは0です。つまり、ビューは、表示に必要なだけのスペースを画面上に占めます。ゼロより大きい値を割り当てると、各ビューのlayout_weightの値と、このビューおよび他のビュー要素の現在のレイアウトで指定された全体のlayout_weightに対する比率に従って、親ビューで利用可能な残りのスペースが分割されます。

例を挙げましょう:横一列にテキストラベルと2つのテキスト編集要素があるとします。ラベルにはlayout_weightが指定されていないため、レンダリングに必要な最小スペースを占めます。2つのテキスト編集要素のそれぞれのlayout_weightが1に設定されている場合、親レイアウトの残りの幅はそれらの間で均等に分割されます(これらは等しく重要であると主張しているため)。最初のレイアウトのlayout_weightが1で、2番目のレイアウトのlayout_weightが2の場合、残りのスペースの3分の1が最初のスペースに割り当てられ、3分の2が2番目のスペースに割り当てられます(2番目のスペースがより重要であると主張しているため)。



4

追加について

vertical向きについては、height0dpに設定することを忘れないでください

android:layout_height="0dp"

horizontal向きについては、width0dpに設定することを忘れないでください

android:layout_width="0dp"

3

LinearLayoutのweightSumと各ビューの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と各ビューのlayout_weightを確認してください。android:weightSum = "4" android:layout_weight = "2" android:layout_weight = "2"それらのlayout_heightはどちらも0pxですが、関連があるかどうかはわかりません。
Ming Leung

0

からの両方の答えを組み合わせる

Flo&rptwsthiおよびroetzi、

を変更することを忘れないでください。変更しないと、最大数が最小スペースを占有し、最小数が最大スペースを占有するとlayout_width=0dp/pxlayout_weight動作が逆になります。

また、ウェイトの組み合わせによっては、レイアウトを表示できない場合があります(スペースを占有しているため)。

これに注意してください。


0

追加するandroid:autoSizeTextType="uniform"と、テキストが自動的にサイズ変更されます


-1

名前が示すように、レイアウトの重みは、特定のフィールドまたはウィジェットが画面スペースを占める必要があるスペースの量またはパーセンテージを指定します。
水平方向の重みを指定する場合、を指定する必要がありますlayout_width = 0px
同様に、垂直方向に重みを指定する場合は、を指定する必要がありますlayout_height = 0px

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.