Layout Linear dan berat di Android

262

Saya selalu membaca tentang nilai bobot lucu ini di dokumentasi Android. Sekarang saya ingin mencobanya untuk pertama kalinya tetapi tidak berfungsi sama sekali.

Seperti yang saya pahami dari dokumentasi tata letak ini:

  <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>

harus membuat dua tombol yang sejajar secara horizontal dan berbagi ruang secara merata. Masalahnya adalah kedua tombol tidak tumbuh untuk mengisi ruang.

Saya ingin tombol untuk tumbuh dan mengisi seluruh baris. Jika kedua tombol diatur untuk mencocokkan induk hanya tombol pertama yang ditampilkan dan mengisi seluruh baris.

Janusz
sumber
pembaruan: dukungan persen Android juga dapat melakukan ini dengan sangat baik. code2concept.blogspot.in/2015/08/...
nitesh

Jawaban:

160

Anda tidak mengatur layout_weightproperti. Kode Anda dibaca weight="1"dan harus dibaca android:layout_weight="1".

JeremyFromEarth
sumber
684

3 hal yang perlu diingat:

  • atur android: layout_width anak-anak menjadi "0dp"
  • atur android: weightSum dari induk ( edit: seperti yang diperhatikan Jason Moore, atribut ini opsional, karena secara default disetel ke jumlah layout_weight anak-anak)
  • atur android: layout_weight setiap anak secara proporsional (mis. weightSum = "5", tiga anak: layout_weight = "1", layout_weight = "3", layout_weight = "1")

Contoh:

    <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>

Dan hasilnya:

Contoh berat tata letak

Anke
sumber
66
Terima kasih atas tip tentang mengatur lebar ke nol. Saya juga menemukan bahwa pengaturan weightSum pada orang tua tidak diperlukan.
Jason Moore
30
Senang tahu, terima kasih. Jika demikian, pengaturan bobot dapat tetap berguna ketika Anda tidak ingin anak-anak mengisi 100% dari orang tua.
Anke
13
Ini benar untuk tata letak XML statis. Jika Anda menambahkan Tampilan secara dinamis saat runtime, Anda harus menggunakan addView dengan parameter tata letak seperti addView(button, new LinearLayout.LayoutParams(0, height, 1));Ini benar bahkan jika Anda menggembungkan tata letak dengan nilai lebar dan berat yang benar.
Nuthatch
Anda mengatakan atur android: weightSum dari induk - atur ke beberapa nilai atau masukkan saja, bagaimana seharusnya itu diatur?
the
1
@batbrat benar, saya menghasilkan UI secara dinamis. Saya terkadang memperlakukan fragmen XML sebagai templat dan kemudian memodifikasi atau mengisi saat runtime. Trik ini tidak berfungsi untuk saya dalam hal ini, saya harus mengatur ulang lebar dan berat eksplisit untuk membuatnya bekerja.
Nuthatch
52

Ini android:layout_weight. Berat hanya bisa digunakan di LinearLayout. Jika orientasi linearlayout adalah Vertikal, gunakan android:layout_height="0dp"dan jika orientasinya horizontal, maka gunakan android:layout_width = "0dp". Ini akan bekerja dengan sempurna.

Manoj Seelan
sumber
16

Coba atur layout_widthkedua tombol ke "0dip" dan weightdari kedua tombol ke0.5

jqpubliq
sumber
Sekarang kedua tombol menghilang dari layar
Janusz
oke, lalu atur lebar layout pada fill_parent dan bobot menjadi 0,5
jqpubliq
lihat ini dan ini . Saya sedikit bingung mengapa ini masih tidak berfungsi tapi mungkin ini akan memberi Anda beberapa ide.
jqpubliq
7

LinearLayout mendukung penetapan bobot untuk masing-masing anak. Atribut ini memberikan nilai " pentingnya " ke tampilan, dan memungkinkannya berkembang untuk mengisi ruang yang tersisa di tampilan induk. Berat standar adalah nol

perhitungan untuk menetapkan sisa / ruang tambahan di antara anak. (bukan total ruang)

penugasan ruang untuk child = (berat individu anak) / (jumlah berat setiap anak dalam Tata Letak Linear)

Contoh (1): jika ada tiga kotak teks dan dua di antaranya menyatakan bobot 1, sedangkan yang ketiga tidak diberi bobot (0), maka Sisa / Ruang tambahan ditugaskan untuk

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

Contoh (2) : misalkan kita memiliki label teks dan dua elemen edit teks dalam baris horizontal. Label tidak memiliki layout_weight yang ditentukan, sehingga membutuhkan ruang minimum yang diperlukan untuk merender. Jika layout_weight dari masing-masing dari dua elemen edit teks diatur ke 1, lebar yang tersisa di tata letak induk akan dibagi sama rata di antara mereka (karena kami mengklaim mereka sama pentingnya).

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

Jika kotak teks pertama memiliki layout_weight 1 dan kotak teks kedua memiliki layout_weight 2, maka sepertiga dari ruang yang tersisa akan diberikan kepada yang pertama, dan dua pertiga untuk yang kedua (karena kami mengklaim yang kedua adalah lebih penting).

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

Di bidang lebar tombol, ganti wrap-contentdengan 0dp.
Gunakan atribut layout_weight tampilan.

android:layout_width="0dp"  

Ini adalah bagaimana kode Anda akan terlihat seperti:

<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 digunakan untuk mendistribusikan ruang apa pun yang tersisa ke dalam proporsi. Dalam hal ini, kedua tombol mengambil lebar "0dp". Jadi, ruang yang tersisa akan dibagi menjadi proporsi 1: 1 di antara mereka, yaitu ruang tersebut akan dibagi secara merata di antara Tampilan Tombol.

Goblin hijau
sumber
6

Seperti jawaban dari @Manoj Seelan

Ganti android:layout_weightdengan android:weight.

Ketika Anda menggunakan Berat dengan LinearLayout. Anda harus menambahkan weightSumdi LinearLayoutdan menurut orientasi Anda LinearLayoutAnda harus menetapkan 0dpuntuk Lebar / Tinggi ke semua LinearLayout`s Anak pandangan

Contoh:

Jika Orientasi Linearlayoutadalah Vertical, maka Tetapkan Lebar semua LinearLayouttampilan Anak dengan0dp

 <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>

Jika orientasinya Linearlayoutadalah horizontal, maka Atur Tinggi semua LinearLayouttampilan Anak dengan 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>
hammed ahmed
sumber
5

Mungkin menyetel kedua tombol pada properti layout_width ke "fill_parent" akan melakukan trik.

Saya baru saja menguji kode ini dan berfungsi di emulator:

<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>

Pastikan untuk mengatur layout_width ke "fill_parent" di kedua tombol.

JeremyFromEarth
sumber
1
ini hanya menekan tombol kanan keluar dari layar dan hanya menunjukkan tombol pertama.
Janusz
4
<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>
Yar
sumber
Sekarang saya lebih suka menyarankan menggunakan layout_weight = "50" dan layout_width = "0px"
Yar
2

Dalam XML di atas, tetapkan android:layout_weighttata letak linear sebagai 2: android:layout_weight="2"

Priyanka
sumber
3
Mengapa itu dibutuhkan? Mengapa tata letak bobot 2 penting? Kenapa tidak 20 atau 200?
Conrad Frix
2

Plus Anda perlu menambahkan ini android:layout_width="0dp"untuk tampilan anak-anak [Tampilan tombol] dariLinerLayout

Rebeka
sumber
2

Anda harus menulis seperti ini Ini berfungsi untuk saya

<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" />
Dinesh Saini
sumber
2

Di bawah ini adalah perubahan (Ditandai dalam BOLD ) dalam kode Anda:

<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>

Karena LinearLayout Anda memiliki orientasi horizontal, maka Anda hanya perlu menjaga lebar Anda hanya 0dp. untuk menggunakan bobot ke arah itu.(Jika orientasi Anda vertikal, Anda akan menjaga ketinggian hanya 0dp) .

Karena ada 2 tampilan dan Anda telah menempatkan android:layout_weight="1"kedua tampilan tersebut, itu berarti ia akan membagi dua tampilan secara merata dalam arah horizontal (atau dengan lebar).

Akshay Chopra
sumber
1
 <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>
Katrina Khan
sumber
0

Ini jawaban sempurna untuk masalah Anda

  <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>
Rahul Mandaliya
sumber
3
Jadi itu "berat" atau "layout_weight" ??
IgorGanapolsky
Ini android: layout_weight
Mahendra Gunawardena
0

Pengganti wrap_contentdengan fill_parent.

Humberto Pinheiro
sumber
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>

masukkan deskripsi gambar di sini

سیدرسول میرعظیمی
sumber