FlowRow dan FlowColumn
adalah composable yang mirip dengan Row dan Column, tetapi berbeda karena item
mengalir ke baris berikutnya saat penampung kehabisan ruang. Tindakan ini akan membuat beberapa baris atau kolom. Jumlah item dalam satu baris juga dapat dikontrol
dengan menetapkan maxItemsInEachRow atau maxItemsInEachColumn. Anda sering kali dapat menggunakan
FlowRow dan FlowColumn untuk membuat tata letak yang responsif— konten tidak akan terpotong
jika item terlalu besar untuk satu dimensi, dan menggunakan kombinasi
maxItemsInEach* dengan Modifier.weight(weight) dapat membantu membuat tata letak yang
mengisi/memperluas lebar baris atau kolom saat diperlukan.
Contoh umumnya adalah untuk chip atau UI pemfilteran:
FlowRowPenggunaan dasar
Untuk menggunakan FlowRow atau FlowColumn, buat composable ini dan tempatkan item
di dalamnya yang harus mengikuti alur standar:
@Composable private fun FlowRowSimpleUsageExample() { FlowRow(modifier = Modifier.padding(8.dp)) { ChipItem("Price: High to Low") ChipItem("Avg rating: 4+") ChipItem("Free breakfast") ChipItem("Free cancellation") ChipItem("£50 pn") } }
Cuplikan ini menghasilkan UI yang ditampilkan di atas, dengan item yang otomatis mengalir ke baris berikutnya saat tidak ada lagi ruang di baris pertama.
Fitur tata letak flow
Tata letak flow memiliki fitur dan properti berikut yang dapat Anda gunakan untuk membuat tata letak yang berbeda di aplikasi Anda.
Pengaturan sumbu utama: pengaturan horizontal atau vertikal
Sumbu utama adalah sumbu tempat item diletakkan (misalnya, di
FlowRow, item disusun secara horizontal). Parameter horizontalArrangement
di FlowRow mengontrol cara ruang kosong didistribusikan di antara item.
Tabel berikut menunjukkan contoh penetapan horizontalArrangement pada item
untuk FlowRow:
Pengaturan horizontal ditetapkan pada |
Hasil |
|
|
|
|
|
|
|
|
|
|
|
Untuk FlowColumn, opsi serupa tersedia dengan verticalArrangement, dengan
default Arrangement.Top.
Pengaturan sumbu silang
Sumbu silang adalah sumbu yang berlawanan arah dengan sumbu utama. Misalnya, di FlowRow, ini adalah sumbu vertikal. Untuk mengubah cara pengaturan keseluruhan
konten di dalam penampung pada sumbu silang, gunakan
verticalArrangement untuk FlowRow, dan horizontalArrangement untuk
FlowColumn.
Untuk FlowRow, tabel berikut menunjukkan contoh penetapan verticalArrangement yang berbeda pada item:
Pengaturan vertikal ditetapkan di |
Hasil |
|
|
|
|
|
Untuk FlowColumn, opsi serupa tersedia dengan horizontalArrangement.
Pengaturan sumbu silang default adalah Arrangement.Start.
Penyelarasan item individual
Anda mungkin ingin memosisikan setiap item dalam baris dengan perataan
yang berbeda. Hal ini berbeda dengan verticalArrangement dan
horizontalArrangement karena menyelaraskan item dalam baris saat ini. Anda dapat
menerapkannya dengan Modifier.align().
Misalnya, jika item dalam FlowRow memiliki tinggi yang berbeda, baris akan mengambil
tinggi item terbesar dan menerapkan Modifier.align(alignmentOption) ke
item:
Perataan vertikal ditetapkan pada |
Hasil |
|
|
|
|
|
Untuk FlowColumn, opsi serupa tersedia. Perataan defaultnya adalah
Alignment.Start.
Item maks dalam baris atau kolom
Parameter maxItemsInEachRow atau maxItemsInEachColumn menentukan item maksimum
di sumbu utama yang diizinkan dalam satu baris sebelum digabungkan ke baris berikutnya. Defaultnya
adalah Int.MAX_INT, yang memungkinkan item sebanyak mungkin, asalkan
ukurannya memungkinkan item tersebut muat dalam baris.
Misalnya, menetapkan maxItemsInEachRow akan memaksa tata letak awal hanya
memiliki 3 item:
Tidak ada batas maksimum yang ditetapkan |
|
|
|
Bobot item
Bobot memperbesar item berdasarkan faktornya dan ruang yang tersedia pada baris tempat item
ditempatkan. Yang penting, ada perbedaan antara FlowRow dan Row
dalam cara bobot digunakan untuk menghitung lebar item. Untuk Rows, bobot
didasarkan pada semua item di Row. Dengan FlowRow, bobot didasarkan pada
item dalam baris tempat item ditempatkan, bukan semua item dalam
penampung FlowRow.
Misalnya, jika Anda memiliki 4 item yang semuanya berada dalam satu baris, masing-masing dengan bobot
1f, 2f, 1f dan 3f yang berbeda, total bobotnya adalah 7f. Sisa ruang
dalam baris atau kolom akan dibagi dengan 7f. Kemudian, setiap lebar item akan
dihitung menggunakan: weight * (remainingSpace / totalWeight).
Anda dapat menggunakan kombinasi Modifier.weight dan item maksimum dengan FlowRow atau
FlowColumn untuk membuat tata letak seperti petak. Pendekatan ini berguna untuk membuat
tata letak responsif yang menyesuaikan dengan ukuran perangkat Anda.
Ada beberapa contoh berbeda tentang hal yang dapat Anda capai menggunakan bobot. Salah satu contohnya adalah petak tempat item berukuran sama, seperti yang ditunjukkan di bawah:
FlowRow untuk membuat petakUntuk membuat petak dengan ukuran item yang sama, Anda dapat melakukan hal berikut:
val rows = 3 val columns = 3 FlowRow( modifier = Modifier.padding(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), maxItemsInEachRow = rows ) { val itemModifier = Modifier .padding(4.dp) .height(80.dp) .weight(1f) .clip(RoundedCornerShape(8.dp)) .background(MaterialColors.Blue200) repeat(rows * columns) { Spacer(modifier = itemModifier) } }
Yang penting, jika Anda menambahkan item lain dan mengulanginya 10 kali, bukan 9, item terakhir akan menggunakan seluruh kolom terakhir, karena total bobot untuk seluruh baris adalah 1f:
FlowRow untuk membuat petak dengan item terakhir menggunakan lebar penuhAnda dapat menggabungkan bobot dengan Modifiers lainnya seperti
Modifier.width(exactDpAmount), Modifier.aspectRatio(aspectRatio), atau
Modifier.fillMaxWidth(fraction). Semua pengubah ini bekerja bersama untuk
memungkinkan ukuran item yang responsif dalam FlowRow (atau FlowColumn).
Anda juga dapat membuat petak bergantian dengan ukuran item yang berbeda, dengan dua item masing-masing menggunakan setengah lebar, dan satu item menggunakan lebar penuh kolom berikutnya:
FlowRow dengan ukuran baris yang berselang-selingAnda dapat melakukannya dengan kode berikut:
FlowRow( modifier = Modifier.padding(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), maxItemsInEachRow = 2 ) { val itemModifier = Modifier .padding(4.dp) .height(80.dp) .clip(RoundedCornerShape(8.dp)) .background(Color.Blue) repeat(6) { item -> // if the item is the third item, don't use weight modifier, but rather fillMaxWidth if ((item + 1) % 3 == 0) { Spacer(modifier = itemModifier.fillMaxWidth()) } else { Spacer(modifier = itemModifier.weight(0.5f)) } } }
Penyesuaian ukuran pecahan
Dengan menggunakan Modifier.fillMaxWidth(fraction), Anda dapat menentukan ukuran
penampung yang harus digunakan item. Hal ini berbeda dengan cara kerja
Modifier.fillMaxWidth(fraction) saat diterapkan ke Row atau Column, karena
item Row/Column menggunakan persentase lebar yang tersisa, bukan
lebar seluruh penampung.
Misalnya, kode berikut memberikan hasil yang berbeda saat menggunakan FlowRow
vs Row:
FlowRow( modifier = Modifier.padding(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), maxItemsInEachRow = 3 ) { val itemModifier = Modifier .clip(RoundedCornerShape(8.dp)) Box( modifier = itemModifier .height(200.dp) .width(60.dp) .background(Color.Red) ) Box( modifier = itemModifier .height(200.dp) .fillMaxWidth(0.7f) .background(Color.Blue) ) Box( modifier = itemModifier .height(200.dp) .weight(1f) .background(Color.Magenta) ) }
|
|
|
|
fillMaxColumnWidth() dan fillMaxRowHeight()
Menerapkan Modifier.fillMaxColumnWidth() atau
Modifier.fillMaxRowHeight() ke item di dalam FlowColumn atau FlowRow
akan memastikan bahwa item di kolom atau baris yang sama menggunakan lebar atau tinggi yang sama dengan
item terbesar di kolom/baris.
Misalnya, contoh ini menggunakan FlowColumn untuk menampilkan daftar dessert
Android. Anda dapat melihat perbedaan lebar setiap item saat
Modifier.fillMaxColumnWidth() diterapkan ke item dibandingkan saat tidak diterapkan
dan item digabungkan.
FlowColumn( Modifier .padding(20.dp) .fillMaxHeight() .fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp), maxItemsInEachColumn = 5, ) { repeat(listDesserts.size) { Box( Modifier .fillMaxColumnWidth() .border(1.dp, Color.DarkGray, RoundedCornerShape(8.dp)) .padding(8.dp) ) { Text( text = listDesserts[it], fontSize = 18.sp, modifier = Modifier.padding(3.dp) ) } } }
|
|
Tidak ada perubahan lebar yang ditetapkan (menggabungkan item) |
|
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Dasar-dasar tata letak Compose
- ConstraintLayout di Compose
- Tindakan editor {:#editor-actions}