webdevqa.jp.net

AndroidのAndroid:weightSumとは何ですか?

知りたい:Android:weightSumとレイアウトの重みとは何ですか?

144
Dhiral Pandya

ドキュメントごとに、Android:weightSumは最大重量の合計を定義し、明示的に指定されていない場合、すべての子のlayout_weightの合計として計算されます。

水平方向のLinearLayoutと3つのImageViewsを含む例を考えてみましょう。ここで、これらのImageViewsが常に同じスペースを取るようにします。これを実現するために、各ImageViewlayout_weightを1に設定すると、コメントに示されているようにweightSumが3に等しくなるように計算されます。

<LinearLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    <!-- Android:weightSum="3" -->
    Android:orientation="horizontal"
    Android:layout_gravity="center">

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

weightSumは、幅と高さを直接設定した場合には発生しない、デバイスのレイアウトを正しく表示するのに役立ちます。

114
superM

SuperMとJeffの答えに加えて、

LinearLayoutに2つのビューがあり、最初はlayout_weightが1で、2番目はlayout_weightが2で、weightSumが指定されていない場合、デフォルトでは、weightSumは3(子の重みの合計)と計算されます最初のビューはスペースの1/3を占有し、2番目のビューは2/3を占有します。

ただし、weightSumを5に指定すると、最初のスペースはスペースの1/5を占有し、2番目のスペースは2/5を占有します。そのため、合計で3/5のスペースがレイアウトで占められ、残りは空のままになります。

167
Shubhayu

documentation はそれを最もよく言い、例を含んでいます(鉱山のハイライト)。

Android:weightSum

最大重量合計を定義します。指定しない場合、すべての子のlayout_weightを加算して合計が計算されます。これは、たとえば、0.5のlayout_weightを指定し、weightSumを1.0に設定することで、使用可能な合計スペースの50%にsingle子を与えるために使用できます。

そのため、superMの例を修正するために、2つのLinearLayoutImageViews withを含む水平方向のTextViewがあるとします。 TextViewを固定サイズに定義し、2つのImageViewsが残りのスペースを等しく占有するようにします。

これを行うには、各ImageViewlayout_weight 1を適用し、TextViewには何も適用せず、weightSumには2.0のLinearLayoutを適用します。

23
Jeff Axelrod

重みの合計は、希望どおりに機能します(他の回答のように、親レイアウトのすべての重みを合計する必要はありません)。子ビューで、必要な重みを指定します。 指定することを忘れないでください

Android:layout_width="0dp" 

以下は例です

    <LinearLayout
                Android:layout_width="500dp"
                Android:layout_height="20dp" >

                <TextView
                    Android:layout_width="0dp"
                    Android:layout_height="match_parent"
                    Android:layout_weight="3"
                    Android:background="@Android:color/holo_green_light"
                    Android:gravity="center"
                    Android:text="30%"
                    Android:textColor="@Android:color/white" >
                </TextView>

                <TextView
                    Android:layout_width="0dp"
                    Android:layout_height="match_parent"
                    Android:layout_weight="2"
                    Android:background="@Android:color/holo_blue_bright"
                    Android:gravity="center"
                    Android:text="20%"
                    Android:textColor="@Android:color/white" >
                </TextView>

                <TextView
                    Android:layout_width="0dp"
                    Android:layout_height="match_parent"
                    Android:layout_weight="5"
                    Android:background="@Android:color/holo_orange_dark"
                    Android:gravity="center"
                    Android:text="50%"
                    Android:textColor="@Android:color/white" >
                </TextView>
 </LinearLayout>

これは次のようになります

enter image description here

22
asok Buzz

いくつかの実験の後、LinearLayoutのアルゴリズムは次のようになります。

weightSumが値に設定されていると仮定します。不在の場合については後で説明します。

最初に、weightSumをLinearLayoutの次元でmatch_parentまたはfill_parentの要素数で除算します(例:layout_widthの場合はorientation="horizontal")。この値を重み乗数と呼びます w_m 各要素に対して。 weightSumのデフォルト値は1.0であるため、デフォルトの重み乗数は1/nです。ここで、nfill_parent要素の数です。 wrap_content要素はnに寄与しません。

w_m = weightSum / #fill_parent

例えば。 weightSumが60で、fill_parent要素が3つある場合、重み乗数は20です。重み乗数は、たとえばlayout_width属性が存在しない場合。

第二に、すべての要素の可能な最大展開が計算されます。最初に、wrap_content要素はその内容に従って計算されます。それらの拡張は、親コンテナの拡張から差し引かれます。残りのexpansion_remainerを呼び出します。この残りはfill_parentに従ってlayout_weight要素に分配されます。

第三に、すべてのfill_parent要素の展開は次のように計算されます:

w_m <em loading=layout_weight / w_m ) * maximum_possible_expansion">

例:

weightSumが60で、幅が10、20、30のfill_parent要素が3つある場合、画面上の展開は親コンテナの2/3、1/3、0/3になります。

weight | expansion
     0 | 3/3
    10 | 2/3
    20 | 1/3
    30 | 0/3
    40 | 0/3

最小展開の上限は0です。最大展開の上限は親サイズです。つまり、重みの上限は0です。

要素がwrap_contentに設定されている場合、その展開が最初に計算され、残りの展開はfill_parent要素間で分散されます。 weightSumが設定されている場合、layout_weightwrap_content要素に影響を与えません。ただし、wrap_content要素は、重みが weight multiplier (例:weightSum = 1の場合は0-1の間、上記の例の場合は0-20の間)。

weightSumが指定されていない場合、すべてのlayout_weight値の合計として計算されます。---(含む要素がwrap_contentに設定されています。したがって、layout_weight要素にwrap_contentを設定すると、canが展開に影響します。例えば。負の重みは、他のfill_parent要素を縮小します。 fill_parent要素をレイアウトする前に、上記の式をwrap_content要素に適用します。可能な最大の拡張は、ラップされたコンテンツに応じた拡張です。 wrap_content要素は縮小され、その後、残りのfill_parent要素の可能な最大拡張が計算されて配布されます。

これは、直感に反する結果につながる可能性があります。

19
Jens Jensen

指定しない場合、すべての子のlayout_weightを加算して合計が計算されます。これは、たとえば、0.5のlayout_weightを指定し、weightSumを1.0に設定することにより、使用可能な合計スペースの50%を単一の子に与えるために使用できます。 「1.2」などの浮動小数点値である必要があります

    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/main_rel"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="horizontal"
        Android:weightSum="2.0" >

        <RelativeLayout
            Android:id="@+id/child_one"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_weight="1.0"
            Android:background="#0000FF" >
        </RelativeLayout>

        <RelativeLayout
            Android:id="@+id/child_two"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_weight="1.0"
            Android:background="#00FF00" >
        </RelativeLayout>

    </LinearLayout>
9
Faakhir

他に誰も言及していないように思われることの1つ:verticalLinearLayoutがあるとしましょうlayout_heightプロパティ(xmlファイルに存在する必要があります)を0dpに設定します。場合によっては、他の値が混乱するようです。

6
Yoav Feuerstein

レイアウトの重みは比率のように機能します。たとえば、垂直レイアウトがあり、2つのアイテム(ボタンやテキストビューなど)がある場合、1つはそれぞれレイアウトの重み2を持ち、もう1つはレイアウトの重み3を持ちます。次に、最初のアイテムは、画面/レイアウトの5分の2の部分を占有し、他のアイテムは5分の3の部分を占有します。ここで5は重量の合計です。すなわち重量合計は、レイアウト全体を定義された部分に分割します。そして、レイアウト重量は、事前定義された合計重量合計のうち特定のアイテムが占める部分を定義します。重量合計は手動で宣言することもできます。 UIデザインに線形レイアウトを使用する場合、ボタン、テキストビュー、編集テキストなどはすべて、weightsumとレイアウトの重みを使用して整理されます。

1
Sami Al-Jabar

開発者から ドキュメント

これは、たとえば、50%のlayout_weightを指定し、weightSumを0.5に設定することで、使用可能な合計スペースの単一の子1.0を提供するために使用できます。

@Shubhayu回答への追加

rest 3/5は、含むレイアウトの特定の部分を実際に必要としない他の子レイアウトに使用できます。

これはAndroid:weightSumプロパティの潜在的な使用です。

1
DjP