Saya ingin tahu: Apa itu android: weightSum dan layout layout, dan bagaimana cara kerjanya?
Saya ingin tahu: Apa itu android: weightSum dan layout layout, dan bagaimana cara kerjanya?
Jawaban:
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.
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.
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
android:layout_width="0dp"
Berikut ini adalah contohnya
<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>
Ini akan terlihat seperti
The dokumentasi mengatakan itu yang terbaik dan termasuk contoh, (menyoroti saya).
android: weightSum
Menentukan jumlah berat maksimum. 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.
Jadi untuk mengoreksi contoh superM, misalkan Anda memiliki LinearLayout
orientasi horizontal yang berisi dua ImageViews
dan TextView
dengan. Anda menentukan TextView
memiliki ukuran tetap, dan Anda ingin keduanya ImageViews
untuk mengambil ruang yang tersisa sama.
Untuk mencapai ini, Anda akan menerapkan layout_weight
1 untuk masing-masing ImageView
, tidak ada pada TextView
, dan a weightSum
dari 2.0 pada LinearLayout
.
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 dengan match_parent
atau fill_parent
dalam dimensi LinearLayout (misalnya layout_width
untuk orientation="horizontal"
). Kami akan menyebut nilai ini pengganda bobot untuk setiap elemen. Nilai default untuk weightSum
adalah 1.0, jadi pengganda bobot default adalah 1/n
, di mana n
jumlah fill_parent
elemen; wrap_content
elemen tidak berkontribusi n
.
Misalnya kapan weightSum
60, dan ada 3 fill_parent
elemen, pengali berat adalah 20. Pengganda berat adalah nilai default untuk misalnya layout_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 petugas expansion_remainer
. Sisanya didistribusikan di antara fill_parent
elemen - elemen sesuai dengan mereka layout_weight
.
Ketiga, perluasan setiap fill_parent
elemen dihitung sebagai:
Contoh:
Jika weightSum
60, dan ada 3 fill_parent
elemen dengan bobot 10, 20 dan 30, ekspansi mereka di layar adalah 2/3, 1/3 dan 0/3 dari wadah induk.
weight | expansion
0 | 3/3
10 | 2/3
20 | 1/3
30 | 0/3
40 | 0/3
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 antara fill_parent
elemen. Jika weightSum
diatur, ini menyebabkan layout_weight
tidak berpengaruh pada wrap_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 untuk weightSum
= 1 atau antara 0-20 untuk contoh di atas).
Jika tidak weightSum
ditentukan, itu dihitung sebagai jumlah dari semua layout_weight
nilai, termasuk elemen dengan wrap_content
set! Jadi setelah layout_weight
menetapkan wrap_content
elemen, dapat mempengaruhi ekspansi mereka. Misalnya, bobot negatif akan mengecilkan fill_parent
elemen lainnya . Sebelum fill_parent
elemen diletakkan, akankah formula di atas diterapkan pada wrap_content
elemen, dengan kemungkinan ekspansi maksimum sesuai dengan konten yang dibungkus. The wrap_content
elemen akan menyusut, dan setelah itu mungkin ekspansi maksimum untuk sisa fill_parent
elemen dihitung dan didistribusikan.
Ini dapat menyebabkan hasil yang tidak intuitif.
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"
<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>
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 memiliki layout_height
properti (yang harus ada dalam xml Anda file) diatur ke 0dp
. Sepertinya nilai lain akan mengacaukan segalanya dalam beberapa kasus.
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.
Dari dokumentasi pengembang
Ini dapat digunakan misalnya untuk memberikan satu anak 50%
dari total ruang yang tersedia dengan memberinya layout_weight of 0.5
dan mengatur weightSum ke 1.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.
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.