Saya ingin tahu: Apa itu android: weightSum dan layout layout, dan bagaimana cara kerjanya?
sumber
Saya ingin tahu: Apa itu android: weightSum dan layout layout, dan bagaimana cara kerjanya?
Per dokumentasi, android:weightSum
menentukan jumlah berat maksimum, dan dihitung sebagai jumlah layout_weight
dari semua anak jika tidak ditentukan secara eksplisit.
Mari kita perhatikan contoh dengan LinearLayout
orientasi horizontal dan 3 ImageViews
di dalamnya. Sekarang kami ingin ini ImageViews
selalu mengambil ruang yang sama. Untuk mencapai ini, Anda dapat mengatur layout_weight
masing-masing ImageView
ke 1 dan weightSum
akan dihitung sama dengan 3 seperti yang ditunjukkan dalam komentar.
<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
berguna untuk membuat tata letak ditampilkan dengan benar untuk perangkat apa pun, yang tidak akan terjadi jika Anda mengatur lebar dan tinggi secara langsung.
weightSum
. Perilaku dalam contoh Anda akan identik denganweightSum
dihilangkan, dan sebenarnya weightSum tidak boleh ditentukan dalam skenario itu. The dokumentasi mengatakan,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
Menambahkan ke jawaban superM dan Jeff,
Jika ada 2 tampilan di LinearLayout, yang pertama dengan layout_weight dari 1, yang kedua dengan layout_weight dari 2 dan tidak ada weightSum yang ditentukan, secara default, weightSum dihitung menjadi 3 (jumlah bobot anak-anak) dan tampilan pertama mengambil 1/3 dari ruang sedangkan yang kedua mengambil 2/3.
Namun, jika kita menentukan beratnya sebagai 5, yang pertama akan mengambil 1/5 dari ruang sementara yang kedua akan mengambil 2/5. Jadi total 3/5 ruang akan ditempati oleh tata letak menjaga sisanya kosong.
sumber
Jumlah bobot bekerja persis seperti yang Anda inginkan (seperti jawaban lain Anda tidak harus menjumlahkan semua bobot pada tata letak induk). Pada tampilan anak, tentukan berat yang Anda inginkan. Jangan lupa untuk menentukan
Berikut ini adalah contohnya
Ini akan terlihat seperti
sumber
The dokumentasi mengatakan itu yang terbaik dan termasuk contoh, (menyoroti saya).
Jadi untuk mengoreksi contoh superM, misalkan Anda memiliki
LinearLayout
orientasi horizontal yang berisi duaImageViews
danTextView
dengan. Anda menentukanTextView
memiliki ukuran tetap, dan Anda ingin keduanyaImageViews
untuk mengambil ruang yang tersisa sama.Untuk mencapai ini, Anda akan menerapkan
layout_weight
1 untuk masing-masingImageView
, tidak ada padaTextView
, dan aweightSum
dari 2.0 padaLinearLayout
.sumber
Setelah beberapa percobaan, saya pikir algoritma untuk LinearLayout adalah ini:
Asumsikan bahwa
weightSum
itu diatur ke nilai. Kasus ketidakhadiran dibahas kemudian.Pertama, bagi
weightSum
dengan jumlah elemen denganmatch_parent
ataufill_parent
dalam dimensi LinearLayout (misalnyalayout_width
untukorientation="horizontal"
). Kami akan menyebut nilai ini pengganda bobot untuk setiap elemen. Nilai default untukweightSum
adalah 1.0, jadi pengganda bobot default adalah1/n
, di manan
jumlahfill_parent
elemen;wrap_content
elemen tidak berkontribusin
.Misalnya kapan
weightSum
60, dan ada 3fill_parent
elemen, pengali berat adalah 20. Pengganda berat adalah nilai default untuk misalnyalayout_width
jika atribut tidak ada.Kedua, ekspansi maksimum yang mungkin dari setiap elemen dihitung. Pertama,
wrap_content
elemen dihitung sesuai dengan isinya. Ekspansi mereka dikurangkan dari ekspansi wadah induk. Kami akan memanggil petugasexpansion_remainer
. Sisanya didistribusikan di antarafill_parent
elemen - elemen sesuai dengan merekalayout_weight
.Ketiga, perluasan setiap
fill_parent
elemen dihitung sebagai:Contoh:
Jika
weightSum
60, dan ada 3fill_parent
elemen dengan bobot 10, 20 dan 30, ekspansi mereka di layar adalah 2/3, 1/3 dan 0/3 dari wadah induk.Ekspansi minimum dibatasi pada 0. Ekspansi maksimum dibatasi pada ukuran induk, yaitu bobot dibatasi pada 0.
Jika elemen diatur ke
wrap_content
, ekspansi dihitung terlebih dahulu, dan ekspansi sisanya tunduk pada distribusi di antarafill_parent
elemen. JikaweightSum
diatur, ini menyebabkanlayout_weight
tidak berpengaruh padawrap_content
elemen. Namun,wrap_content
elemen masih dapat didorong keluar dari area yang terlihat oleh elemen yang beratnya lebih rendah dari (misalnya antara 0-1 untukweightSum
= 1 atau antara 0-20 untuk contoh di atas).Jika tidak
weightSum
ditentukan, itu dihitung sebagai jumlah dari semualayout_weight
nilai, termasuk elemen denganwrap_content
set! Jadi setelahlayout_weight
menetapkanwrap_content
elemen, dapat mempengaruhi ekspansi mereka. Misalnya, bobot negatif akan mengecilkanfill_parent
elemen lainnya . Sebelumfill_parent
elemen diletakkan, akankah formula di atas diterapkan padawrap_content
elemen, dengan kemungkinan ekspansi maksimum sesuai dengan konten yang dibungkus. Thewrap_content
elemen akan menyusut, dan setelah itu mungkin ekspansi maksimum untuk sisafill_parent
elemen dihitung dan didistribusikan.Ini dapat menyebabkan hasil yang tidak intuitif.
sumber
Jika tidak ditentukan, jumlah dihitung dengan menambahkan layout_weight dari semua anak. Ini dapat digunakan misalnya untuk memberikan anak tunggal 50% dari total ruang yang tersedia dengan memberinya layout_weight 0,5 dan mengatur weightSum menjadi 1,0. Harus berupa nilai titik apung, seperti "1.2"
sumber
Satu hal yang tampaknya seperti tidak ada orang lain yang disebutkan: katakanlah Anda memiliki vertikal
LinearLayout
, sehingga agar bobot dalam tata letak / elemen / view di dalamnya bekerja 100% benar - semua dari mereka harus memilikilayout_height
properti (yang harus ada dalam xml Anda file) diatur ke0dp
. Sepertinya nilai lain akan mengacaukan segalanya dalam beberapa kasus.sumber
Layout Weight berfungsi seperti rasio. Misalnya, jika ada tata letak vertikal dan ada dua item (seperti tombol atau tampilan teks), satu memiliki bobot tata letak 2 dan lainnya memiliki bobot tata letak 3 masing-masing. Maka item pertama akan menempati 2 dari 5 bagian layar / tata letak dan yang lainnya 3 dari 5 bagian. Di sini 5 adalah jumlah berat. yaitu jumlah Berat membagi seluruh tata letak menjadi beberapa bagian yang ditentukan. Dan Layout Weight menentukan seberapa banyak porsi item tertentu dari total Bobot yang ditentukan sebelumnya. Jumlah berat dapat dinyatakan secara manual juga. Tombol, tampilan teks, edittext, dll. Semua diatur menggunakan bobot dan bobot tata letak saat menggunakan tata letak linier untuk desain UI.
sumber
Dari dokumentasi pengembang
Ini dapat digunakan misalnya untuk memberikan satu anak
50%
dari total ruang yang tersedia dengan memberinya layout_weight of0.5
dan mengatur weightSum ke1.0
.Tambahan untuk jawaban @Shubhayu
sisanya
3/5
dapat digunakan untuk tata letak anak lain yang benar-benar tidak memerlukan bagian tertentu dari tata letak yang mengandung.ini adalah potensi penggunaan
android:weightSum
properti.sumber