Apa arti dari android: layout_weight?

650

Saya tidak mengerti cara menggunakan atribut ini. Adakah yang bisa menceritakan lebih banyak tentang hal itu kepada saya?

Mojiiz
sumber

Jawaban:

860

Dengan layout_weightAnda dapat menentukan rasio ukuran antara beberapa tampilan. Misalnya Anda memiliki MapViewdan tableyang harus menunjukkan beberapa informasi tambahan ke peta. Peta harus menggunakan 3/4 layar dan tabel harus menggunakan 1/4 layar. Kemudian Anda akan mengatur layout_weightthe mapke 3 dan layout_weightthetable ke 1.

Untuk membuatnya berfungsi, Anda juga harus mengatur tinggi atau lebar (tergantung pada orientasi Anda) ke 0px.

Flo
sumber
208
menggaruk kepala sampai Anda menyebutkan ketinggian 0px!
JohnnyLambada
24
Untuk menentukan yang mana dari mereka akan dipengaruhi oleh berat. Lebar atau tinggi.
neteinstein
30
Anda membutuhkan 0px. Contoh: Anda ingin menerapkan tabel dengan dua kolom berukuran sama. Setiap baris tabel adalah tata letak linier horizontal dengan dua "sel tabel" (misalnya, TextViews), masing-masing memiliki layout_weight = .5. Jika Anda menentukan layout_width = "wrap_content" pada "sel tabel," lebar konten akan ditambahkan ke lebar yang dihitung oleh layout_weight, sel-sel tabel akan semua ukuran berbeda, dan kolom tidak akan berbaris dengan benar. Jadi Anda harus mengatur layout_width = 0dp sehingga android hanya menggunakan layout_weight untuk menghitung lebar sel.
eeeeaaii
3
@Solace, jawaban terlambat, tapi demi kelengkapan .. Sepertinya atribut bobot tidak berkontribusi ke RelativeLayout. Ini hanya berfungsi dengan LinearLayout. Jika Anda melihat perlunya bobot, mungkin cara untuk pergi adalah membuat LinearLayout (dengan bobot) di dalam RelativeLayout.
bbv
1
Layout Layout berfungsi hanya untuk tata letak linier atau akan berfungsi untuk setiap grup tampilan.
meShakti
247

Singkatnya, layout_weighttentukan berapa banyak ruang ekstra dalam tata letak yang akan dialokasikan untuk tampilan.

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 default tampilan adalah nol.

Perhitungan untuk menetapkan sisa ruang antara anak

Secara umum, rumusnya adalah:

ruang yang ditugaskan 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 ruang yang tersisa ditetapkan sebagai berikut:

Kotak teks 1 = 1 / (1 + 1 + 0)

Kotak teks 2 = 1 / (1 + 1 + 0)

Kotak teks ke-3 = 0 / (1 + 1 + 0)

Contoh 2

Katakanlah kita memiliki label teks dan dua elemen edit teks dalam satu baris horizontal. Label tidak layout_weightditentukan, sehingga membutuhkan ruang minimum yang diperlukan untuk merender. Jikalayout_weight 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).

Perhitungan:

Label 1 = 0 / (0 +1 + 1)

Kotak teks 2 = 1 / (0 + 1 + 1)

Kotak teks ke-3 = 1 / (0 + 1 + 1)

Sebaliknya, jika kotak teks yang pertama memiliki angka layout_weight1, dan kotak teks yang kedua memiliki alayout_weight 2, maka sepertiga dari ruang yang tersisa akan diberikan kepada yang pertama, dan dua pertiga untuk yang kedua (karena kami mengklaim yang kedua satu lebih penting).

Perhitungan:

Label 1 = 0 / (0 + 1 + 2)

Kotak teks 2 = 1 / (0 + 1 + 2)

Kotak teks ke-3 = 2 / (0 + 1 + 2)


Artikel sumber

Tabut
sumber
19
Penjelasan yang jauh lebih baik daripada jawaban yang dipilih saat ini.
Shade
12
Nah, ada penjelasan sederhana (yang saya hargai) dan detail seluk beluk (yang saya hargai dengan cara yang berbeda). Keduanya jawaban yang bagus.
cbmanica
3
Seperti disebutkan di tempat lain, android:layout_width="0px"ini penting. Juga, bobot tidak harus bilangan bulat.
Brian White
Ini sedikit lebih sulit untuk dipahami daripada jawaban yang dipilih, tetapi memberikan jawaban yang lengkap - terutama ketika beberapa pandangan memiliki bobot dan beberapa tidak. Itu adalah use case besar yang tidak tercakup oleh jawaban yang dipilih.
Acey
dari mana weightSumdatang ke gambar itu? Apakah ada hubungannya dengan layout_weight?
eRaisedToX
72

menambahkan ke jawaban lain, hal yang paling penting untuk mendapatkan ini berfungsi adalah mengatur lebar tata letak (atau tinggi) ke 0px

android:layout_width="0px"

jika tidak, Anda akan melihat sampah

roetzi
sumber
Saya pikir itu tergantung jika Anda ingin menyembunyikan tampilan yang tidak menentukan bobotnya atau Anda ingin menunjukkannya dengan ukuran sesuai ukuran dan meninggalkan ruang kosong yang tersisa ke tampilan "tertimbang".
Andrea Leganza
Bagaimana jika saya perlu mengatur berat horisontal dan vertikal?
Alston
40

Jika ada beberapa tampilan yang mencakup a LinearLayout, maka layout_weightberikan masing-masing ukuran proporsional. Tampilan dengan layout_weightnilai lebih besar "lebih berat" lebih banyak, sehingga mendapat ruang yang lebih besar.

Berikut ini adalah gambar untuk membuat segalanya lebih jelas.

masukkan deskripsi gambar di sini

Teori

Berat tata letak istilah terkait dengan konsep rata-rata tertimbang dalam matematika. Ini seperti di kelas perguruan tinggi di mana pekerjaan rumah bernilai 30%, kehadiran bernilai 10%, ujian tengah semester bernilai 20%, dan final bernilai 40%. Skor Anda untuk bagian-bagian itu, ketika ditimbang bersama, memberi Anda nilai total Anda.

masukkan deskripsi gambar di sini

Sama untuk bobot tata letak. Dalam Viewshorizontal LinearLayoutmasing-masing dapat mengambil persentase tertentu dari total lebar. (Atau persentase tinggi untuk vertikalLinearLayout .)

Tata Letak

Yang LinearLayoutAnda gunakan akan terlihat seperti ini:

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

    <!-- list of subviews -->

</LinearLayout>

Perhatikan bahwa Anda harus menggunakan layout_width="match_parent"untuk LinearLayout. Jika Anda menggunakan wrap_content, maka itu tidak akan berhasil. Perhatikan juga bahwa layout_weighttidak berfungsi untuk tampilan di RelativeLayouts (lihat di sini dan di sini untuk jawaban SO yang berurusan dengan masalah ini).

Pemandangan

Setiap tampilan dalam horizontal LinearLayoutterlihat seperti ini:

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

Perhatikan bahwa Anda harus menggunakannya layout_width="0dp"bersama layout_weight="1". Lupa ini menyebabkan banyak masalah pengguna baru. (Lihat artikel ini untuk hasil berbeda yang bisa Anda peroleh dengan tidak mengatur lebar ke 0.) Jika pandangan Anda dalam bentuk vertikal LinearLayout maka Anda akan menggunakan layout_height="0dp", tentu saja.

Dalam Button contoh di atas saya mengatur bobot ke 1, tetapi Anda dapat menggunakan nomor apa pun. Hanya total yang penting. Anda dapat melihat di tiga baris tombol pada gambar pertama yang saya posting, angkanya semua berbeda, tetapi karena proporsinya sama, lebar tertimbang tidak berubah di setiap baris. Beberapa orang suka menggunakan angka desimal yang memiliki jumlah 1 sehingga dalam tata letak yang kompleks jelas berapa berat setiap bagian.

Satu catatan terakhir. Jika Anda memiliki banyak tata letak bersarang yang digunakan layout_weight, itu bisa berakibat buruk untuk kinerja.

Tambahan

Berikut adalah tata letak xml untuk gambar atas:

<?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>
Suragch
sumber
1
Saya selalu bertanya-tanya mengapa lebih banyak orang tidak memposting gambar untuk melengkapi XML mereka. Jauh lebih mudah untuk memahami visual daripada kode.
AleksandrH
30

layout_weightmemberi tahu Android cara mendistribusikan Viewfile Anda di a LinearLayout. Android kemudian pertama-tama menghitung proporsi total yang diperlukan untuk semua Viewyang memiliki bobot yang ditentukan dan menempatkan masing-masing Viewsesuai dengan fraksi layar yang telah ditentukan yang dibutuhkannya. Pada contoh berikut, Android melihat bahwa TextViews memiliki layout_weightdari 0(ini adalah default) dan EditTexts memiliki layout_weightdari 2masing-masing, sementara Buttonmemiliki berat 1. Jadi Android mengalokasikan ruang 'cukup' untuk ditampilkan tvUsernamedan tvPasswordkemudian membagi sisa lebar layar menjadi 5 bagian yang sama, dua di antaranya dialokasikan untuk etUsername, dua ke etPassworddan bagian terakhir untuk 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>

Sepertinya:
orientasi lanskap dan
orientasi tegak

Tash Pemhiwa
sumber
tautan tidak tersedia lagi. Jika Anda memiliki referensi bagus lainnya, harap perbarui.
BinaryGuy
16

Pikirkan seperti itu, akan lebih sederhana

Jika Anda memiliki 3 tombol dan bobotnya adalah 1,3,1, itu akan berfungsi seperti tabel dalam HTML

Berikan 5 bagian untuk baris itu: 1 bagian untuk tombol 1, 3 bagian untuk tombol 2 dan 1 bagian untuk tombol 1

Menganggap,

George Nguyen
sumber
10

salah satu penjelasan terbaik untuk saya adalah yang ini (dari tutorial Android, lihat langkah 7) :

layout_weight digunakan dalam LinearLayouts untuk menetapkan "kepentingan" untuk Tampilan dalam tata letak. Semua Tampilan memiliki layout_weight default nol, yang berarti mereka hanya memakan banyak ruang di layar karena harus ditampilkan. Menetapkan nilai yang lebih tinggi dari nol akan membagi sisa ruang yang tersedia di Tampilan induk, sesuai dengan nilai setiap layout_weight Tampilan dan perbandingannya terhadap keseluruhan layout_weight yang ditentukan dalam tata letak saat ini untuk elemen tampilan ini dan lainnya.

Untuk memberikan contoh: katakanlah 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). Jika yang pertama memiliki layout_weight 1 dan yang 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 lebih penting).

Andre Steingress
sumber
4

Untuk tambahan :

Untuk verticalorientasi, jangan lupa atur heightke 0dp

android:layout_height="0dp"

Untuk horizontalorientasi, jangan lupa atur widthke 0dp

android:layout_width="0dp"
Alen Lee
sumber
3

Silakan lihat weightSum of LinearLayout dan layout_weight dari setiap View. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Layout_height keduanya 0px, tapi saya tidak yakin itu relevan

<?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>
Ming Leung
sumber
Silakan lihat weightSum of LinearLayout dan layout_weight dari setiap View. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Layout_height keduanya 0px, tapi saya tidak yakin itu relevan.
Ming Leung
0

Menggabungkan kedua jawaban dari

Flo & rptwsthi dan roetzi,

Jangan lupa untuk mengubah Anda layout_width=0dp/px, kalau tidak layout_weightperilaku akan bertindak terbalik dengan jumlah terbesar menempati ruang terkecil dan jumlah terendah menempati ruang terbesar.

Selain itu, beberapa kombinasi bobot akan menyebabkan beberapa tata letak tidak dapat ditampilkan (karena melebihi ruang).

Waspadai ini.

pengguna2837483
sumber
0

Menambahkan android:autoSizeTextType="uniform"akan mengubah ukuran teks untuk Anda secara otomatis

skryshtafovych
sumber
-1

Seperti namanya, bobot Tata Letak menentukan jumlah atau persentase ruang mana bidang atau widget tertentu harus menempati ruang layar.
Jika kita menentukan bobot dalam orientasi horizontal, maka kita harus menentukan layout_width = 0px.
Demikian pula, Jika kita menentukan berat dalam orientasi vertikal, maka kita harus menentukan layout_height = 0px.

Akanksha Hegde
sumber