Thanh ứng dụng

Thanh ứng dụng là các vùng chứa cung cấp cho người dùng quyền truy cập vào các tính năng và mục điều hướng chính. Có hai loại thanh ứng dụng là thanh ứng dụng trên cùng và thanh ứng dụng dưới cùng. Sau đây là hình thức và mục đích tương ứng:

Loại

Diện mạo

Mục đích

Thanh ứng dụng trên cùng

Ở đầu màn hình.

Cấp quyền truy cập vào các tác vụ và thông tin chính. Thường thì lưu trữ một tiêu đề, các mục hành động chính và một số mục điều hướng nhất định.

Thanh ứng dụng ở dưới cùng

Ở cuối màn hình.

Thường bao gồm các mục điều hướng chính. Cũng có thể cung cấp quyền truy cập vào các thao tác chính khác, chẳng hạn như thông qua một nút hành động nổi có chứa.

Ví dụ về thanh ứng dụng trên cùng và dưới cùng.
Hình 1. Thanh ứng dụng trên cùng (bên trái) và thanh ứng dụng ở dưới cùng (bên phải).

Để triển khai thanh ứng dụng trên cùng và thanh ứng dụng dưới cùng, hãy sử dụng các thành phần kết hợp TopAppBarBottomAppBar tương ứng. Chúng cho phép bạn tạo các giao diện nhất quán đóng gói các thành phần điều khiển thao tác và điều hướng, cũng như phù hợp với các nguyên tắc của Material Design.

Thanh ứng dụng trên cùng

Bảng sau đây trình bày 4 loại thanh ứng dụng trên cùng:

Loại

Ví dụ

Nhỏ: Dành cho màn hình không yêu cầu nhiều thao tác hoặc thao tác.

Thanh ứng dụng nhỏ trên cùng

Căn giữa: Dành cho các màn hình có một thao tác chính duy nhất.

Thanh ứng dụng trên cùng được căn giữa

Trung bình: Dành cho các màn hình yêu cầu thao tác và thao tác vừa phải.

Thanh ứng dụng ở trên cùng trung bình

Lớn: Dành cho những màn hình yêu cầu nhiều thao tác và thao tác.

Thanh ứng dụng lớn trên cùng

Nền tảng API

Các thành phần kết hợp cho phép bạn triển khai 4 thanh ứng dụng trên cùng khá giống nhau. Chúng có chung một số tham số chính:

  • title: Văn bản xuất hiện trên thanh ứng dụng.
  • navigationIcon: Biểu tượng chính để điều hướng. Xuất hiện ở bên trái thanh ứng dụng.
  • actions: Các biểu tượng cho phép người dùng truy cập vào các thao tác chính. Chúng xuất hiện ở bên phải thanh ứng dụng.
  • scrollBehavior: Xác định cách thanh ứng dụng trên cùng phản hồi thao tác cuộn nội dung bên trong của scaffold (giàn giáo).
  • colors: Xác định cách thanh ứng dụng xuất hiện.

Hành vi cuộn

Bạn có thể kiểm soát cách thanh ứng dụng phản hồi khi người dùng cuộn nội dung bên trong của scaffold nhất định. Để thực hiện việc này, hãy tạo một bản sao của TopAppBarScrollBehavior và truyền bản sao đó đến thanh ứng dụng trên cùng cho tham số scrollBehavior.

Có 3 loại TopAppBarScrollBehavior. Các điều khoản này như sau:

  • enterAlwaysScrollBehavior: Khi người dùng kéo nội dung bên trong của scaffold lên, thanh ứng dụng trên cùng sẽ thu gọn. Thanh ứng dụng sẽ mở rộng khi người dùng kéo nội dung bên trong xuống.
  • exitUntilCollapsedScrollBehavior: Tương tự như enterAlwaysScrollBehavior, mặc dù thanh ứng dụng cũng sẽ mở rộng khi người dùng xem đến cuối nội dung bên trong của scaffold (giàn giáo).
  • pinnedScrollBehavior: Thanh ứng dụng vẫn giữ nguyên và không phản ứng với thao tác cuộn.

Các ví dụ sau đây triển khai một số tuỳ chọn trong số này.

Ví dụ

Các phần sau đây cung cấp cách triển khai cho 4 loại thanh ứng dụng trên cùng, bao gồm nhiều ví dụ về cách bạn có thể kiểm soát hành vi cuộn.

Nhỏ

Để tạo một thanh ứng dụng nhỏ trên cùng, hãy sử dụng thành phần kết hợp TopAppBar. Đây là thanh ứng dụng trên cùng đơn giản nhất có thể và trong ví dụ này chỉ chứa một tiêu đề.

Ví dụ sau không truyền một giá trị cho TopAppBar đối với scrollBehavior và do đó, giá trị này không phản ứng với thao tác cuộn nội dung bên trong.

@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)
    }
}

Phương thức triển khai có dạng như sau:

Ví dụ về thanh ứng dụng nhỏ trên cùng.
Hình 2. Thanh ứng dụng nhỏ ở trên cùng.

Đã căn giữa

Thanh ứng dụng trên cùng được căn giữa về cơ bản giống với thanh ứng dụng nhỏ, mặc dù tiêu đề được căn giữa trong thành phần. Để triển khai, hãy sử dụng thành phần kết hợp CenterAlignedTopAppBar chuyên biệt.

Ví dụ này sử dụng enterAlwaysScrollBehavior() để nhận giá trị mà nó truyền cho scrollBehavior. Do đó, thanh này sẽ thu gọn khi người dùng cuộn nội dung bên trong của scaffold (giàn giáo).

@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)
    }
}

Phương thức triển khai có dạng như sau:

Viết văn bản thay thế tại đây
Hình 3. Thanh ứng dụng trên cùng được căn giữa.

Medium

Thanh ứng dụng trên cùng trung bình đặt tiêu đề bên dưới bất kỳ biểu tượng bổ sung nào. Để tạo một đối tượng, hãy sử dụng thành phần kết hợp MediumTopAppBar.

Giống như đoạn mã trước, ví dụ này sử dụng enterAlwaysScrollBehavior() để nhận giá trị mà đoạn mã chuyển cho 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)
    }
}

Phương thức triển khai này xuất hiện như sau, kèm theo thông tin minh hoạ cách hoạt động cuộn của enterAlwaysScrollBehavior() xuất hiện:

Hình 4. Thanh ứng dụng trên cùng được căn giữa.

Lớn

Thanh ứng dụng lớn trên cùng cũng tương tự như phương tiện, mặc dù khoảng đệm giữa tiêu đề và biểu tượng lớn hơn và chiếm nhiều không gian hơn trên màn hình tổng thể. Để tạo một mã, hãy sử dụng thành phần kết hợp LargeTopAppBar.

Không giống như các đoạn mã trước, ví dụ này sử dụng exitUntilCollapsedScrollBehavior() để nhận giá trị mà đoạn mã chuyển cho scrollBehavior. Do đó, thanh sẽ thu gọn khi người dùng cuộn nội dung bên trong của scaffold, nhưng sau đó sẽ mở rộng khi người dùng cuộn đến cuối nội dung bên trong.

@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)
    }
}

Phương thức triển khai có dạng như sau:

Màn hình trong một ứng dụng có thanh ứng dụng ở dưới cùng chứa các biểu tượng hành động ở bên trái và một nút hành động nổi ở bên phải.
Hình 5. Ví dụ về cách triển khai thanh ứng dụng lớn trên cùng.

Thanh ứng dụng ở dưới cùng

Để tạo thanh ứng dụng ở dưới cùng, hãy sử dụng thành phần kết hợp BottomAppBar. Cách sử dụng thành phần kết hợp này khá giống với các thành phần kết hợp của thanh ứng dụng trên cùng được mô tả trong các phần trước của trang này. Bạn truyền các thành phần kết hợp cho các tham số chính sau:

  • actions: Một loạt biểu tượng xuất hiện ở bên trái thanh. Đây thường là các thao tác chính trên màn hình đã cho hoặc các mục điều hướng.
  • floatingActionButton: Nút hành động nổi xuất hiện ở bên phải của thanh.

@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."
        )
    }
}

Phương thức triển khai có dạng như sau:

Màn hình trong một ứng dụng có thanh ứng dụng ở dưới cùng chứa các biểu tượng hành động ở bên trái và một nút hành động nổi ở bên phải.
Hình 6. Ví dụ về cách triển khai thanh ứng dụng ở dưới cùng.

Tài nguyên khác