web-dev-qa-db-ja.com

Androidの線形レイアウトとウェイト

私はいつもAndroidのドキュメントでこのおもしろい重みの値について読みました。今、私は初めてそれを試してみたいのですが、それはまったく機能していません。

このレイアウトの説明からわかるように、

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

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        weight="1" />

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        weight="1" />

  </LinearLayout>

水平に配置され、スペースを均等に共有する2つのボタンを作成する必要があります。問題は、2つのボタンがスペースを埋めるために大きくならないことです。

ボタンを大きくして行全体を埋めたいと思います。両方のボタンが親と一致するように設定されている場合、最初のボタンだけが表示され、行全体に表示されます。

246
Janusz

layout_weightプロパティを設定していません。あなたのコードはweight="1"を読み、それはAndroid:layout_weight="1"を読むべきです。

148
JeremyFromEarth

覚えておくべき3つのこと:

  • androidのAndroid:layout_width "0dp"に設定します。
  • jason Mooreが気づいたように、親のAndroid:weightSumを編集します( edit:、この属性はオプションです)。デフォルトでは子のlayout_weightの合計に設定されているため)
  • 各子のAndroid:layout_weightを比例的に設定します(例:weightSum = "5"、3人の子:layout_weight = "1"、layout_weight = "3" layout_weight = "1")

例:

    <LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:weightSum="5">

    <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="3"
        Android:text="2" />

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

    </LinearLayout>

そしてその結果:

Layout weight example

655
Anke

それはAndroid:layout_weightです。 weightはLinearLayoutでのみ使用できます。 linearlayoutの向きがVerticalの場合はAndroid:layout_height="0dp"を、向きが水平の場合はAndroid:layout_width = "0dp"を使用します。それは完璧に機能します。

51
Manoj Seelan

この画像は線形レイアウトを要約したものです。

Linear Layout and Weight

トピックの詳細についてはこのリンクをたどることができます。 ちょうど数学 - ビュー、ビューグループ、レイアウト

リニアレイアウトのビデオチュートリアル:幅、高さ、重さ

Androidリニアレイアウトチュートリアル

22
Cheezy Code

両方のボタンのlayout_widthを "0dip"に、両方のボタンのweight0.5に設定してみてください。

15
jqpubliq

LinearLayoutは個々の子供に重みを割り当てることをサポートします。この属性は、ビューに "important"値を割り当て、親ビューの残りのスペースを埋めるように拡張できるようにします。デフォルトの重みはゼロです

子の間に任意の残り/追加のスペースを割り当てる計算。 (総スペースではありません)

子供に割り当てるスペース=(子供の個別の体重)/(リニアレイアウトのすべての子供の体重の合計)

例(1):3つのテキストボックスがあり、そのうちの2つがウェイト1を宣言し、3つ目がウェイトなし(0)の場合その後、残り/追加のスペースを割り当てる

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

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

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

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

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 
7
Rakesh Soni

Buttonのwidthフィールドで、wrap-content0dpに置き換えます。
ビューのlayout_weight属性を使用してください。

Android:layout_width="0dp"  

これはあなたのコードがどのように見えるかです:

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

 <Button
    Android:text="Register"
    Android:id="@+id/register"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:padding="10dip"
    Android:layout_weight="1" />

 <Button
    Android:text="Not this time"
    Android:id="@+id/cancel"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:padding="10dip"
    Android:layout_weight="1" />    

</LinearLayout>

layout_weightは、余ったスペースをプロポーションに配分するために使用されます。この場合、2つのボタンの幅は "0dp"です。したがって、残りのスペースはそれらの間で1:1の比率に分割されます。つまり、スペースはボタンビュー間で均等に分割されます。

6
Green goblin

@ Manoj Seelan の回答のように

Android:layout_weightAndroid:weightに置き換えます。

LinearLayoutと共にWeightを使うとき。 weightSumLinearLayoutを追加する必要があります。また、LinearLayoutの向きに応じて、Width/Heightに0dpをすべてのLinearLayoutの子ビューに設定する必要があります。

例:

ifLinearlayoutの向きがVerticalである場合、すべてのLinearLayoutの子ビューの幅を設定0dpを持つビュー

 <LinearLayout
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:orientation="vertical"
     Android:weightSum="3">

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="2" />

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="1" />

  </LinearLayout>

の向きLinearlayouthorizontalの場合、すべてのLinearLayout`s ChildrenビューのSet Heightは0dpで表示されます。

 <LinearLayout
     Android:layout_width="fill_parent"
     Android:layout_height="wrap_content"
     Android:orientation="horizontal"
     Android:weightSum="3">

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="wrap_content"
        Android:layout_height="0dp"
        Android:padding="10dip"
        Android:layout_weight="2" />

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="wrap_content"
        Android:layout_height="0dp"
        Android:padding="10dip"
        Android:layout_weight="1" />

  </LinearLayout>
5
ahmed hamdy
<LinearLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/logonFormButtons"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:baselineAligned="true"       
        Android:orientation="horizontal">

        <Button
            Android:id="@+id/logonFormBTLogon"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"            
            Android:text="@string/logon"
            Android:layout_weight="0.5" />

        <Button
            Android:id="@+id/logonFormBTCancel"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"            
            Android:text="@string/cancel"
            Android:layout_weight="0.5" />
    </LinearLayout>
4
Yar

おそらく、両方のボタンのlayout_widthプロパティを "fill_parent"に設定するとうまくいくでしょう。

このコードをテストしたところ、エミュレータで動作します。

<LinearLayout Android:layout_width="fill_parent"
          Android:layout_height="wrap_content">

    <Button Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:text="hello world"/>

    <Button Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:text="goodbye world"/>

</LinearLayout>

両方のボタンで必ずlayout_widthを "fill_parent"に設定してください。

4
JeremyFromEarth

あなたはこのように書く必要があります

<LinearLayout
         Android:layout_width="fill_parent"
         Android:layout_height="wrap_content"
         Android:orientation="horizontal"
            Android:weightSum="2">

         <Button
            Android:text="Register"
            Android:id="@+id/register"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:padding="10dip"
            Android:layout_weight="1" />

         <Button
            Android:text="Not this time"
            Android:id="@+id/cancel"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:padding="10dip"
            Android:layout_weight="1" />
2
Dinesh Saini

加えて、LinerLayoutの子ビュー[Button views]にこのAndroid:layout_width="0dp"を追加する必要があります。

2
Rebeka

上記のXMLでは、線形レイアウトのAndroid:layout_weight2に設定します。Android:layout_weight="2"

2
Priyanka

以下は、(BOLDでマークされた)コードの変更点です。

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

     <Button
        Android:text="Register"
        Android:id="@+id/register"
        Android:layout_width="0dp" //changes made here
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="1" /> //changes made here

     <Button
        Android:text="Not this time"
        Android:id="@+id/cancel"
        Android:layout_width="0dp" //changes made here
        Android:layout_height="wrap_content"
        Android:padding="10dip"
        Android:layout_weight="1" /> //changes made here

  </LinearLayout>

LinearLayoutは水平方向の向きを持っているので、その方向にウェイトを使用するためには幅を0dp。に保つ必要があります。 (向きが垂直の場合、身長は0dpに保たれます)

2つのビューがあり、両方のビューにAndroid:layout_weight="1"を配置したので、それは2つのビューを水平方向に(または幅で)均等に分割することを意味します。

1
Akshay Chopra
 <LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">

    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="2"
        Android:text="Button 1" />

    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="3"
        Android:text="Button 2" />

    <Button
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="2"
        Android:text="Button 3" />

    </LinearLayout>
1
Katrina Khan

wrap_contentfill_parentに置き換えます。

0
 <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_gravity="center"
            Android:background="#008">

            <RelativeLayout
                Android:id="@+id/paneltamrin"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="1"
                Android:gravity="center"

                >
                <Button
                    Android:id="@+id/BtnT1"
                    Android:layout_width="wrap_content"
                    Android:layout_height="150dp"
                    Android:drawableTop="@Android:drawable/ic_menu_edit"
                    Android:drawablePadding="6dp"
                    Android:padding="15dp"
                    Android:text="AndroidDhina"
                    Android:textColor="#000"
                    Android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                Android:id="@+id/paneltamrin2"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="1"
                Android:gravity="center"
                >
                <Button
                    Android:layout_width="wrap_content"
                    Android:layout_height="150dp"
                     Android:drawableTop="@Android:drawable/ic_menu_edit"
                    Android:drawablePadding="6dp"
                    Android:padding="15dp"
                    Android:text="AndroidDhina"
                    Android:textColor="#000"
                    Android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

enter image description here

これはあなたの問題の完璧な答えです

  <LinearLayout 
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent" 
        Android:layout_height="wrap_content"
        Android:orientation="horizontal"  >   
     <Button 
        Android:text="Register" Android:id="@+id/register"
        Android:layout_width="wrap_content" Android:layout_height="wrap_content"
        Android:padding="10dip" weight="1" />
     <Button 
        Android:text="Not this time" Android:id="@+id/cancel"
        Android:layout_width="wrap_content" Android:layout_height="wrap_content"
        Android:padding="10dip" weight="1" />
  </LinearLayout>
0
Rahul Mandaliya