Panel aplikasi

Panel aplikasi adalah penampung yang memberi pengguna akses ke fitur utama dan item navigasi. Ada dua jenis panel aplikasi, yaitu panel aplikasi atas dan panel aplikasi bawah. Tampilan dan tujuan masing-masing adalah sebagai berikut:

Jenis

Tampilan

Tujuan

Panel aplikasi atas

Di bagian atas layar.

Memberikan akses ke tugas dan informasi penting. Umumnya menghosting judul, item tindakan inti, dan item navigasi tertentu.

Panel aplikasi bawah

Di bagian bawah layar.

Biasanya mencakup item navigasi inti. Dapat juga memberikan akses ke tindakan utama lainnya, seperti melalui tombol tindakan mengambang (FAB) yang ada di dalamnya.

Contoh panel aplikasi atas dan bawah.
Gambar 1. Panel aplikasi atas (kiri) dan panel aplikasi bawah (kanan).

Untuk mengimplementasikan panel aplikasi atas dan panel aplikasi bawah, gunakan composable TopAppBar dan BottomAppBar. Dengan komponen ini, Anda dapat membuat antarmuka konsisten yang mengenkapsulasi kontrol navigasi dan tindakan, serta selaras dengan prinsip Desain Material.

Panel aplikasi atas

Tabel berikut menguraikan empat jenis panel aplikasi atas:

Jenis

Contoh

Kecil: Untuk layar yang tidak memerlukan banyak navigasi atau tindakan.

Panel aplikasi atas kecil

Rata tengah: Untuk layar yang memiliki satu tindakan utama.

Panel aplikasi atas rata tengah

Sedang: Untuk layar yang memerlukan navigasi dan tindakan dalam jumlah sedang.

Panel aplikasi atas sedang

Besar: Untuk layar yang memerlukan banyak navigasi dan tindakan.

Panel aplikasi atas besar

Platform API

Berbagai composable yang memungkinkan Anda mengimplementasikan empat panel aplikasi atas yang berbeda cukup mirip. Keduanya memiliki beberapa parameter utama yang sama:

  • title: Teks yang muncul di panel aplikasi.
  • navigationIcon: Ikon utama untuk navigasi. Muncul di sebelah kiri panel aplikasi.
  • actions: Ikon yang memberi pengguna akses ke tindakan utama. Tindakan ini muncul di sebelah kanan panel aplikasi.
  • scrollBehavior: Menentukan respons panel aplikasi atas terhadap scroll konten dalam scaffold.
  • colors: Menentukan tampilan panel aplikasi.

Perilaku scroll

Anda dapat mengontrol cara panel aplikasi merespons saat pengguna men-scroll konten dalam scaffold yang diberikan. Untuk melakukannya, buat instance TopAppBarScrollBehavior dan teruskan ke panel aplikasi atas untuk parameter scrollBehavior.

Ada tiga jenis TopAppBarScrollBehavior. Berikut adalah jenis-jenisnya:

  • enterAlwaysScrollBehavior: Saat pengguna menarik konten dalam scaffold, panel aplikasi atas akan diciutkan. Panel aplikasi diperluas saat pengguna mulai menarik konten dalam ke bawah.
  • exitUntilCollapsedScrollBehavior: Serupa dengan enterAlwaysScrollBehavior, meskipun panel aplikasi hanya diperluas saat pengguna menarik konten sepenuhnya ke bawah.
  • pinnedScrollBehavior: Panel aplikasi tetap di tempatnya dan tidak bereaksi terhadap scrolling.

Contoh berikut menerapkan beberapa opsi ini.

Contoh

Bagian berikut memberikan implementasi untuk empat jenis panel aplikasi atas yang berbeda, termasuk berbagai contoh cara mengontrol perilaku scroll.

Kecil

Untuk membuat panel aplikasi atas kecil, gunakan composable TopAppBar. Contoh berikut mengimplementasikan panel aplikasi atas dasar yang hanya berisi judul.

Contoh berikut tidak meneruskan nilai untuk scrollBehavior ke TopAppBar, sehingga tidak bereaksi terhadap scroll konten dalam.

@Composable
fun SmallTopAppBarExample() {
    Scaffold(
        topBar = {
            TopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Small Top App Bar")
                }
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Implementasi ini akan terlihat seperti berikut:

Contoh panel aplikasi atas kecil.
Gambar 2. Panel aplikasi atas kecil.

Rata tengah

Panel aplikasi atas yang rata tengah pada dasarnya sama dengan panel aplikasi kecil, meskipun judulnya berada di tengah komponen. Untuk mengimplementasikannya, gunakan composable CenterAlignedTopAppBar khusus.

Contoh ini menggunakan enterAlwaysScrollBehavior() untuk mendapatkan nilai yang diteruskannya untuk scrollBehavior. Dengan demikian, panel akan diciutkan saat pengguna men-scroll konten dalam scaffold.

@Composable
fun CenterAlignedTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),

        topBar = {
            CenterAlignedTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Centered Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Implementasi ini akan terlihat seperti berikut:

Contoh panel aplikasi atas yang rata tengah.
Gambar 3. Panel aplikasi atas yang rata tengah.

Sedang

Panel aplikasi atas sedang menempatkan judul di bawah ikon tambahan. Untuk membuatnya, gunakan composable MediumTopAppBar.

Seperti cuplikan sebelumnya, contoh ini menggunakan enterAlwaysScrollBehavior() untuk mendapatkan nilai yang diteruskan untuk scrollBehavior.

@Composable
fun MediumTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            MediumTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Medium Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Implementasi ini akan muncul sebagai berikut, dengan demonstrasi tampilan perilaku scroll dari enterAlwaysScrollBehavior():

Gambar 4. Panel aplikasi atas sedang yang diciutkan saat pengguna men-scroll ke atas dan diperluas saat pengguna men-scroll ke bawah.

Besar

Panel aplikasi atas yang besar mirip dengan yang sedang, meskipun padding antara judul dan ikon lebih besar dan menempati lebih banyak ruang di layar secara keseluruhan. Untuk membuatnya, gunakan composable LargeTopAppBar.

Tidak seperti cuplikan sebelumnya, contoh ini menggunakan exitUntilCollapsedScrollBehavior() untuk mendapatkan nilai yang diteruskan untuk scrollBehavior. Dengan demikian, panel akan diciutkan saat pengguna men-scroll konten dalam scaffold, tetapi kemudian diperluas saat pengguna men-scroll ke akhir konten dalam.

@Composable
fun LargeTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            LargeTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Large Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Implementasi ini akan terlihat seperti berikut:

Layar di aplikasi dengan panel aplikasi bawah yang berisi empat ikon tindakan di sisi kiri, dan tombol tindakan mengambang di sisi kanan.
Gambar 5. Contoh penerapan panel aplikasi atas yang besar.

Panel aplikasi bawah

Untuk membuat panel aplikasi bawah, gunakan composable BottomAppBar. Penggunaan composable ini cukup mirip dengan composable panel aplikasi atas yang dijelaskan di bagian sebelumnya di halaman ini. Anda meneruskan composable untuk parameter utama berikut:

  • actions: Serangkaian ikon yang muncul di sisi kiri panel. Ini biasanya berupa tindakan utama untuk layar tertentu, atau item navigasi.
  • floatingActionButton: Tombol tindakan mengambang (FAB) yang muncul di sisi kanan panel.

@Composable
fun BottomAppBarExample() {
    Scaffold(
        bottomBar = {
            BottomAppBar(
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(Icons.Filled.Check, contentDescription = "Localized description")
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Edit,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Mic,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Image,
                            contentDescription = "Localized description",
                        )
                    }
                },
                floatingActionButton = {
                    FloatingActionButton(
                        onClick = { /* do something */ },
                        containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
                        elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                    ) {
                        Icon(Icons.Filled.Add, "Localized description")
                    }
                }
            )
        },
    ) { innerPadding ->
        Text(
            modifier = Modifier.padding(innerPadding),
            text = "Example of a scaffold with a bottom app bar."
        )
    }
}

Implementasi ini akan terlihat seperti berikut:

Layar di aplikasi dengan panel aplikasi bawah yang berisi empat ikon tindakan di sisi kiri, dan tombol tindakan mengambang di sisi kanan.
Gambar 6. Contoh penerapan panel aplikasi bawah.

Referensi lainnya