Jawaban:
Dengan layout_weight
Anda dapat menentukan rasio ukuran antara beberapa tampilan. Misalnya Anda memiliki MapView
dan table
yang 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_weight
the map
ke 3 dan layout_weight
thetable
ke 1.
Untuk membuatnya berfungsi, Anda juga harus mengatur tinggi atau lebar (tergantung pada orientasi Anda) ke 0px.
Singkatnya, layout_weight
tentukan 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.
Secara umum, rumusnya adalah:
ruang yang ditugaskan untuk child = (berat individu anak) / (jumlah berat setiap anak dalam Tata Letak Linear)
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)
Katakanlah kita memiliki label teks dan dua elemen edit teks dalam satu baris horizontal. Label tidak layout_weight
ditentukan, 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_weight
1, 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)
android:layout_width="0px"
ini penting. Juga, bobot tidak harus bilangan bulat.
weightSum
datang ke gambar itu? Apakah ada hubungannya dengan layout_weight
?
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
Jika ada beberapa tampilan yang mencakup a LinearLayout
, maka layout_weight
berikan masing-masing ukuran proporsional. Tampilan dengan layout_weight
nilai lebih besar "lebih berat" lebih banyak, sehingga mendapat ruang yang lebih besar.
Berikut ini adalah gambar untuk membuat segalanya lebih jelas.
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.
Sama untuk bobot tata letak. Dalam Views
horizontal LinearLayout
masing-masing dapat mengambil persentase tertentu dari total lebar. (Atau persentase tinggi untuk vertikalLinearLayout
.)
Yang LinearLayout
Anda 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_weight
tidak berfungsi untuk tampilan di RelativeLayouts (lihat di sini dan di sini untuk jawaban SO yang berurusan dengan masalah ini).
Setiap tampilan dalam horizontal LinearLayout
terlihat 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.
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>
layout_weight
memberi tahu Android cara mendistribusikan View
file Anda di a LinearLayout
. Android kemudian pertama-tama menghitung proporsi total yang diperlukan untuk semua View
yang memiliki bobot yang ditentukan dan menempatkan masing-masing View
sesuai dengan fraksi layar yang telah ditentukan yang dibutuhkannya. Pada contoh berikut, Android melihat bahwa TextView
s memiliki layout_weight
dari 0
(ini adalah default) dan EditText
s memiliki layout_weight
dari 2
masing-masing, sementara Button
memiliki berat 1
. Jadi Android mengalokasikan ruang 'cukup' untuk ditampilkan tvUsername
dan tvPassword
kemudian membagi sisa lebar layar menjadi 5 bagian yang sama, dua di antaranya dialokasikan untuk etUsername
, dua ke etPassword
dan 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:
dan
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,
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).
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
Layout_weight mendefinisikan berapa banyak ruang yang harus diperoleh kontrol masing-masing untuk kontrol lain.
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>
Menggabungkan kedua jawaban dari
Flo & rptwsthi dan roetzi,
Jangan lupa untuk mengubah Anda layout_width=0dp/px
, kalau tidak layout_weight
perilaku 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.
Menambahkan android:autoSizeTextType="uniform"
akan mengubah ukuran teks untuk Anda secara otomatis
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
.