web-dev-qa-db-ja.com

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

この属性の使い方がわかりません。誰もがそれについてもっと教えてもらえますか?

623
Mojiiz

layout_weightを使うと、複数のビュー間のサイズ比を指定できます。例えば。あなたはMapViewtableを持っています。それらは地図に追加情報を表示します。マップは画面の3/4を使用し、テーブルは画面の1/4を使用する必要があります。それからmaplayout_weightを3に、そしてtablelayout_weightを1に設定します。

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

823
Flo

一言で言えば、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が指定されていないため、レンダリングに必要な最小スペースを占有します。 2つのテキスト編集要素のそれぞれのlayout_weightが1に設定されている場合、親レイアウトの残りの幅はそれらの間で均等に分割されます(それらが同様に重要であると主張するため)。

計算:

第1ラベル= 0 /(0 + 1 + 1)

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

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

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

計算:

最初のラベル= 0 /(0 + 1 + 2)

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

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


ソース記事

237
ArK

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

Android:layout_width="0px"

そうでなければゴミが見えるでしょう

67
roetzi

LinearLayoutにまたがる複数のビューがある場合、layout_weightはそれぞれに比例したサイズを与えます。大きなlayout_weight値を持つビューはより「重さが増す」ので、より大きなスペースが得られます。

これは物事をより明確にするためのイメージです。

enter image description here

理論

レイアウトの重みという用語は、数学における 加重平均 の概念に関連しています。それは宿題が30%の価値がある、出席が10%の価値がある、中期が20%の価値がある、そして最終的に40%の価値がある大学の授業のようです。これらの部分に対するあなたの得点は、一緒に重み付けされたとき、あなたにあなたの総成績を与えます。

enter image description here

レイアウトの太さも同じです。水平方向のViewsLinearLayoutはそれぞれ、全幅の一定の割合を占めることができます。 (または垂直方向のLinearLayoutの高さのパーセンテージ)

レイアウト

あなたが使うLinearLayoutは次のようになります。

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

    <!-- list of subviews -->

</LinearLayout>

LinearLayoutにはlayout_width="match_parent"を使用する必要があります。 wrap_contentを使用した場合、それは機能しません。 layout_weightはRelativeLayoutsのビューでは機能しないことにも注意してください( SO この問題に関する回答については here および here を参照)。

ビュー

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

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

layout_width="0dp"layout_weight="1"と一緒に使用する必要があることに注意してください。これを忘れると、多くの新規ユーザーの問題を引き起こします。 (幅を0に設定しないことで得られるさまざまな結果については この記事 を参照してください。)ビューが vertical 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>
33
Suragch

layout_weightはAndroidにViewLinearLayoutで配布する方法を指示します。次に、Androidは最初にウェイトが指定されているすべてのViewに必要な合計比率を計算し、指定した画面のどの部分に応じて各Viewを配置します。次の例では、AndroidはTextViewlayout_weight0(これがデフォルト)とEditTextlayout_weight2をそれぞれ持ち、Buttonの重みは1です。そのため、AndroidはtvUsernametvPasswordを表示するのに十分なスペースを割り当ててから、残りの画面幅を5つの部分に分割し、そのうちの2つを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>

それはように見えます:
landscape orientation そして
portrait orientation

29
Tash Pemhiwa

そのように考えて、もっと簡単になるでしょう

あなたが3つのボタンを持っていて、それに応じてそれらの重みが1,3,1であるならば、それはHTMLの表のように動作します

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

15
George Nguyen

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

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

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

10

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

layout_weightは、コントロールが他のコントロールに対してそれぞれどのくらいのスペースを確保しなければならないかを定義します。

6
Vladimir Ivanov

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>
3
Ming Leung

追加の場合

verticalのオリエンテーションの場合、heightを0dpに設定することを忘れないでください

Android:layout_height="0dp"

horizontalのオリエンテーションの場合、widthを0dpに設定することを忘れないでください

Android:layout_width="0dp"
2
Alen Lee

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

Flo&rptwsthi and roetzi、

あなたのlayout_width=0dp/pxを変更することを忘れないでください、さもなければ、layout_weightの振る舞いは、最大の数が最小のスペースを占め、最小の数が最大のスペースを占めて逆に作用します。

その上、いくつかの重みの組み合わせはいくつかのレイアウトが表示されない原因になります(それはスペースを過剰に占めていたので)。

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

0
user2837483

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

0
skryshtafovych