Box trong Jetpack Compose: nó là gì, thuộc tính composable và cách hoạt động

Tác giả: IT Sectr Đã đăng: 2026-06-29 Thời gian đọc: 10 phút

Box là một hàm composable trong Jetpack Compose để đặt các phần tử con chồng lên nhau theo lớp. Không giống như Row và Column, Box xếp chồng các phần tử trong cùng một khu vực, cho phép tạo kết cấu, huy hiệu và chỉ báo tùy chỉnh. Theo Google Android Documentation, 2025, Box là một trong ba container cơ bản của Compose và cung cấp khả năng quản lý lớp linh hoạt thông qua Modifier.align và Modifier.zIndex.

Những điểm chính

  • Box là một container Compose xếp chồng các phần tử con lên nhau, trong đó mỗi phần tử tiếp theo được vẽ lên trên phần tử trước đó.
  • contentAlignment thiết lập căn chỉnh cho tất cả nội dung của Box, trong khi Modifier.align cung cấp định vị riêng cho từng phần tử con.
  • Modifier.zIndex kiểm soát thứ tự vẽ của các phần tử, cho phép nâng một số lớp lên trên các lớp khác.
  • Box được sử dụng để phủ văn bản lên hình ảnh, tạo huy hiệu thông báo, phù hiệu và lớp nền.
  • Modifier.clipToBounds giới hạn việc hiển thị các phần tử con trong ranh giới của Box, ngăn nội dung tràn ra ngoài container.

Box trong Jetpack Compose là gì?

Box là một hàm composable đặt các phần tử con trong cùng một khu vực, xếp chồng chúng lên nhau. Phần tử con đầu tiên được vẽ ở dưới cùng, phần tử cuối cùng ở trên cùng. Theo mặc định, Box điều chỉnh theo kích thước của phần tử con lớn nhất.

Không giống như Row và Column, Box không sắp xếp các phần tử tuần tự — tất cả các phần tử con chiếm cùng một khu vực và có thể chồng lên nhau. Điều này làm cho Box không thể thiếu để tạo các lớp giao diện.

Kích thước của Box được xác định theo quy tắc: nếu không có phần tử con nào có kích thước cố định, Box thu nhỏ xuống kích thước tối thiểu. Nếu có ít nhất một phần tử con có Modifier.fillMaxSize, Box mở rộng đến tối đa.

Theo Android Developers Blog, 2024, Box là container hiệu quả nhất trong Compose cho các trường hợp phần tử không yêu cầu sắp xếp tuần tự. Box không thực hiện các phép đo bổ sung để định vị, không giống như Row và Column.

Chữ ký cơ bản của Box

Box chấp nhận các tham số modifier, contentAlignment và propagateMinConstraints. Tất cả các phần tử con được truyền trong khối content, mỗi phần tử có thể có các bổ ngữ riêng.

kotlin
@Composable
fun BoxExample() {
    Box(
        modifier = Modifier.size(200.dp),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier.fillMaxSize().background(Color.Blue)
        )
        Text(
            text = "Xin chào",
            color = Color.White
        )
    }
}

ContentAlignment và Modifier.align trong Box

contentAlignment là một tham số của Box thiết lập căn chỉnh mặc định cho tất cả các phần tử con. Nếu không được chỉ định, Alignment.TopStart được sử dụng — các phần tử được đặt ở góc trên bên trái của container.

Modifier.align cho phép ghi đè căn chỉnh cho một phần tử con cụ thể độc lập với contentAlignment. Ví dụ: Box với Alignment.Center có thể chứa phần tử với Modifier.align(Alignment.BottomEnd) sẽ được ghim vào góc dưới bên phải.

Theo Material Design Guidelines, 2025, Modifier.align rất hữu ích để định vị huy hiệu và biểu tượng trên hình nền. Điều này cho phép thiết lập căn chỉnh chung cho tất cả nội dung của Box và ghi đè nó cho các phần tử riêng lẻ.

Bảng giá trị Alignment

Giá trịVị trí trong BoxVí dụ sử dụng
TopStartGóc trên bên tráiBiểu tượng ở góc thẻ
TopCenterTrên cùng ở giữaTiêu đề phía trên hình ảnh
CenterTrung tâm containerVăn bản căn giữa trên nền
BottomEndGóc dưới bên phảiSố thông báo trên biểu tượng
BottomCenterDưới cùng ở giữaChú thích bên dưới hình ảnh

Ví dụ với Modifier.align

Trong ví dụ này, Box chứa một hình nền và một huy hiệu ở góc dưới bên phải. Modifier.align(BottomEnd) định vị huy hiệu độc lập với contentAlignment của Box.

kotlin
@Composable
fun BadgeExample() {
    Box(
        modifier = Modifier.size(120.dp),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier.size(100.dp).background(Color.Gray)
        )
        Box(
            modifier = Modifier
                .size(30.dp)
                .align(Alignment.BottomEnd)
                .background(Color.Red, CircleShape)
        )
    }
}

Quản lý lớp với zIndex

Modifier.zIndex kiểm soát thứ tự vẽ của các phần tử bên trong Box. Theo mặc định, các phần tử được vẽ theo thứ tự khai báo — phần tử đầu tiên ở dưới cùng, phần tử cuối cùng ở trên cùng. zIndex ghi đè thứ tự này.

Một phần tử có zIndex 2.0f được vẽ phía trên phần tử có zIndex 1.0f, bất kể thứ tự của chúng trong mã. Giá trị zIndex âm đặt phần tử bên dưới các phần tử khác. Theo Android Developers, 2024, zIndex chỉ ảnh hưởng đến thứ tự vẽ, không ảnh hưởng đến xử lý sự kiện chạm.

zIndex đặc biệt hữu ích trong hoạt ảnh và các thành phần có thể kéo, nơi một phần tử cần tạm thời nổi lên trên các phần tử khác. Ví dụ: khi kéo một thẻ, zIndex của nó tăng lên để không bị các phần tử lân cận che khuất.

kotlin
@Composable
fun ZIndexExample() {
    Box(modifier = Modifier.size(150.dp)) {
        Box(modifier = Modifier.size(80.dp)
            .align(Alignment.TopStart)
            .zIndex(2.0f)
            .background(Color.Green))
        Box(modifier = Modifier.size(100.dp)
            .align(Alignment.Center)
            .zIndex(1.0f)
            .background(Color.Blue))
    }
}

Ví dụ thực tế sử dụng Box

Box được sử dụng rộng rãi để phủ văn bản lên hình ảnh. Hình nền được đặt trước, sau đó văn bản với Modifier.align để định vị trên nền.

kotlin
@Composable
fun ImageWithOverlay() {
    Box(modifier = Modifier.fillMaxWidth().height(200.dp)) {
        Image(
            painter = painterResource(R.drawable.photo),
            contentDescription = "Photo",
            modifier = Modifier.fillMaxSize(),
            contentScale = ContentScale.Crop
        )
        Box(
            modifier = Modifier.fillMaxSize()
                .background(Color.Black.copy(alpha = 0.4f))
        )
        Text(
            text = "Tiêu đề",
            color = Color.White,
            modifier = Modifier.align(Alignment.BottomStart)
                .padding(16.dp)
        )
    }
}

Ví dụ thứ hai là Box để tạo chỉ báo tải. Box chiếm toàn bộ khu vực màn hình và CircularProgressIndicator được căn giữa thông qua contentAlignment.

kotlin
@Composable
fun LoadingOverlay() {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        CircularProgressIndicator(
            modifier = Modifier.size(48.dp)
        )
    }
}

Ràng buộc kích thước Box

Box theo mặc định điều chỉnh theo kích thước nội dung của nó. Nếu các phần tử con có kích thước khác nhau, Box lấy kích thước của phần tử lớn nhất. Khi không có phần tử con, Box thu nhỏ xuống kích thước tối thiểu.

Modifier.clipToBounds giới hạn việc hiển thị các phần tử con trong ranh giới của Box. Nếu không có bổ ngữ này, các phần tử con có thể mở rộng ra ngoài Box. Theo Material Design Guidelines, 2025, clipToBounds là bắt buộc khi sử dụng Modifier.scale hoặc Modifier.graphicsLayer bên trong Box.

propagateMinConstraints là một tham số của Box truyền các ràng buộc kích thước tối thiểu đến các phần tử con. Nếu được đặt thành true, các phần tử con không thể nhỏ hơn kích thước tối thiểu được đặt cho Box thông qua Modifier.size hoặc Modifier.constrain.

  • Box — container tối thiểu nếu không có kích thước nào được đặt và không có phần tử con nào có fillMaxSize
  • Modifier.clipToBounds ngăn nội dung tràn ra ngoài ranh giới Box
  • propagateMinConstraints truyền các ràng buộc tối thiểu đến các phần tử con

Câu hỏi thường gặp

Box khác Row và Column như thế nào?

Box xếp chồng các phần tử lên nhau, trong khi Row và Column sắp xếp chúng tuần tự. Box phù hợp cho các lớp và lớp phủ, Row cho các hàng ngang và Column cho các danh sách dọc.

Làm cách nào để căn chỉnh một phần tử trong Box khác với các phần tử còn lại?

Sử dụng Modifier.align cho một phần tử con cụ thể. Bổ ngữ này ghi đè contentAlignment được đặt cho toàn bộ Box. Ví dụ: Modifier.align(Alignment.BottomEnd) ghim phần tử vào góc dưới bên phải.

Làm thế nào để tạo Box có màu nền và văn bản căn giữa?

Tạo một Box với Modifier.size và Modifier.background, và đặt contentAlignment thành Alignment.Center. Văn bản bên trong Box sẽ tự động được căn giữa mà không cần bổ ngữ bổ sung.

propagateMinConstraints trong Box là gì?

propagateMinConstraints truyền các ràng buộc kích thước tối thiểu của Box đến các phần tử con. Khi được đặt thành true, các phần tử con không thể nhỏ hơn kích thước tối thiểu được đặt cho Box thông qua Modifier.size hoặc Modifier.constrain.

Làm cách nào để đặt phần tử này lên trên phần tử khác trong Box với kiểm soát thứ tự?

Thứ tự khai báo của các phần tử trong Box xác định thứ tự trực quan của chúng: phần tử đầu tiên ở dưới cùng, phần tử cuối cùng ở trên cùng. Để kiểm soát chính xác, hãy sử dụng Modifier.zIndex — phần tử có giá trị cao hơn được vẽ phía trên các phần tử còn lại.

Tóm tắt

  • Box là một container Compose xếp chồng các phần tử con lên nhau trong cùng một khu vực, trong đó mỗi phần tử tiếp theo được vẽ lên trên phần tử trước đó.
  • contentAlignment thiết lập căn chỉnh mặc định cho tất cả các phần tử con, trong khi Modifier.align cung cấp định vị riêng.
  • Modifier.zIndex kiểm soát thứ tự vẽ của các lớp, cho phép nâng hoặc hạ các phần tử bất kể thứ tự khai báo của chúng.
  • Box được sử dụng để phủ văn bản lên hình ảnh, tạo huy hiệu, chỉ báo tải và lớp nền.
  • Modifier.clipToBounds giới hạn việc hiển thị các phần tử con trong ranh giới của Box, ngăn nội dung tràn ra ngoài container.
  • propagateMinConstraints truyền các ràng buộc tối thiểu đến các phần tử con, hữu ích để tạo các container tùy chỉnh với kích thước tối thiểu cố định.
  • Để sắp xếp tuần tự các phần tử theo chiều ngang hoặc chiều dọc, hãy sử dụng Row hoặc Column; cho các lớp và lớp phủ, hãy sử dụng Box.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm