知りたい:Android:weightSumとレイアウトの重みとは何ですか?
ドキュメントごとに、Android:weightSum
は最大重量の合計を定義し、明示的に指定されていない場合、すべての子のlayout_weight
の合計として計算されます。
水平方向のLinearLayout
と3つのImageViews
を含む例を考えてみましょう。ここで、これらのImageViews
が常に同じスペースを取るようにします。これを実現するために、各ImageView
のlayout_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
は、幅と高さを直接設定した場合には発生しない、デバイスのレイアウトを正しく表示するのに役立ちます。
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のスペースがレイアウトで占められ、残りは空のままになります。
documentation はそれを最もよく言い、例を含んでいます(鉱山のハイライト)。
Android:weightSum
最大重量合計を定義します。指定しない場合、すべての子のlayout_weightを加算して合計が計算されます。これは、たとえば、0.5のlayout_weightを指定し、weightSumを1.0に設定することで、使用可能な合計スペースの50%にsingle子を与えるために使用できます。
そのため、superMの例を修正するために、2つのLinearLayout
とImageViews
withを含む水平方向のTextView
があるとします。 TextView
を固定サイズに定義し、2つのImageViews
が残りのスペースを等しく占有するようにします。
これを行うには、各ImageView
にlayout_weight
1を適用し、TextView
には何も適用せず、weightSum
には2.0のLinearLayout
を適用します。
重みの合計は、希望どおりに機能します(他の回答のように、親レイアウトのすべての重みを合計する必要はありません)。子ビューで、必要な重みを指定します。 指定することを忘れないでください
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>
これは次のようになります
いくつかの実験の後、LinearLayoutのアルゴリズムは次のようになります。
weightSum
が値に設定されていると仮定します。不在の場合については後で説明します。
最初に、weightSum
をLinearLayoutの次元でmatch_parent
またはfill_parent
の要素数で除算します(例:layout_width
の場合はorientation="horizontal"
)。この値を重み乗数と呼びます 各要素に対して。 weightSum
のデフォルト値は1.0であるため、デフォルトの重み乗数は1/n
です。ここで、n
はfill_parent
要素の数です。 wrap_content
要素はn
に寄与しません。
例えば。 weightSum
が60で、fill_parent
要素が3つある場合、重み乗数は20です。重み乗数は、たとえばlayout_width
属性が存在しない場合。
第二に、すべての要素の可能な最大展開が計算されます。最初に、wrap_content
要素はその内容に従って計算されます。それらの拡張は、親コンテナの拡張から差し引かれます。残りのexpansion_remainer
を呼び出します。この残りはfill_parent
に従ってlayout_weight
要素に分配されます。
第三に、すべてのfill_parent
要素の展開は次のように計算されます:
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_weight
はwrap_content
要素に影響を与えません。ただし、wrap_content
要素は、重みが (例: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
要素の可能な最大拡張が計算されて配布されます。
これは、直感に反する結果につながる可能性があります。
指定しない場合、すべての子の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>
他に誰も言及していないように思われることの1つ:verticalLinearLayout
があるとしましょうlayout_height
プロパティ(xmlファイルに存在する必要があります)を0dp
に設定します。場合によっては、他の値が混乱するようです。
レイアウトの重みは比率のように機能します。たとえば、垂直レイアウトがあり、2つのアイテム(ボタンやテキストビューなど)がある場合、1つはそれぞれレイアウトの重み2を持ち、もう1つはレイアウトの重み3を持ちます。次に、最初のアイテムは、画面/レイアウトの5分の2の部分を占有し、他のアイテムは5分の3の部分を占有します。ここで5は重量の合計です。すなわち重量合計は、レイアウト全体を定義された部分に分割します。そして、レイアウト重量は、事前定義された合計重量合計のうち特定のアイテムが占める部分を定義します。重量合計は手動で宣言することもできます。 UIデザインに線形レイアウトを使用する場合、ボタン、テキストビュー、編集テキストなどはすべて、weightsumとレイアウトの重みを使用して整理されます。
開発者から ドキュメント
これは、たとえば、50%
のlayout_weightを指定し、weightSumを0.5
に設定することで、使用可能な合計スペースの単一の子1.0
を提供するために使用できます。
@Shubhayu回答への追加
rest 3/5
は、含むレイアウトの特定の部分を実際に必要としない他の子レイアウトに使用できます。
これはAndroid:weightSum
プロパティの潜在的な使用です。