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 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.
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.
@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 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ẻ.
| Giá trị | Vị trí trong Box | Ví dụ sử dụng |
|---|---|---|
| TopStart | Góc trên bên trái | Biểu tượng ở góc thẻ |
| TopCenter | Trên cùng ở giữa | Tiêu đề phía trên hình ảnh |
| Center | Trung tâm container | Văn bản căn giữa trên nền |
| BottomEnd | Góc dưới bên phải | Số thông báo trên biểu tượng |
| BottomCenter | Dưới cùng ở giữa | Chú thích bên dưới hình ảnh |
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.
@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)
)
}
}
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.
@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))
}
}
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.
@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.
@Composable
fun LoadingOverlay() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(
modifier = Modifier.size(48.dp)
)
}
}
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.
Câu hỏi thường gặp
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.
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.
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 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.
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
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.
Đọc thêm