Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Ứng dụng của bạn không chỉ chạy trên một chiếc điện thoại. Người dùng có máy nhỏ, máy lớn, máy tính bảng, màn hình gập và cả chế độ xoay ngang. Thiết kế thích ứng đảm bảo giao diện đẹp và dùng được trên mọi kích thước thay vì chỉ trên máy bạn thử.
Lỗi phổ biến của người mới là đặt chiều rộng và chiều cao bằng số cứng, ví dụ nút rộng 350. Trên màn hình nhỏ hơn nó tràn, trên màn hình lớn lại lọt thỏm. Thay vào đó hãy dùng bố cục co giãn: tỉ lệ, linh hoạt (flex), tối đa và tối thiểu, cùng các điểm ngắt để đổi bố cục khi không gian thay đổi.
Thay vì phân biệt máy bằng tên thiết bị, hãy dựa vào không gian có sẵn của cửa sổ ứng dụng, vì ứng dụng có thể chạy trong chế độ chia đôi màn hình hoặc cửa sổ nhỏ. Một cách phân loại thường dùng:
| Loại | Chiều rộng gợi ý | Bố cục thường dùng |
|---|---|---|
| Compact | Dưới khoảng 600 dp | Một cột, thanh điều hướng dưới |
| Medium | Khoảng 600 đến 840 dp | Thanh điều hướng bên (rail), có thể hai cột |
| Expanded | Trên khoảng 840 dp | Hai hoặc ba cột, ngăn điều hướng cố định |
Các ngưỡng trên là gợi ý theo hướng dẫn thiết kế của Android; bạn có thể điều chỉnh cho phù hợp sản phẩm.
Dùng LayoutBuilder để biết ràng buộc của vùng cha, hoặc MediaQuery để biết kích thước cửa sổ:
class ResponsiveScaffold extends StatelessWidget {
const ResponsiveScaffold({super.key});
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth >= 840) {
return const Row(
children: [
SizedBox(width: 300, child: ListPane()),
VerticalDivider(width: 1),
Expanded(child: DetailPane()),
],
);
}
return const ListPane(); // điện thoại: chỉ hiện danh sách
},
);
}
}
Dùng LayoutBuilder thường tốt hơn MediaQuery khi bố cục phụ thuộc không gian của chính widget đó thay vì toàn màn hình.
@Composable
fun AdaptiveScreen(windowWidth: WindowWidthSizeClass) {
when (windowWidth) {
WindowWidthSizeClass.Compact -> ListScreen()
else -> Row {
ListScreen(modifier = Modifier.weight(1f))
DetailScreen(modifier = Modifier.weight(2f))
}
}
}
import { useWindowDimensions, View } from 'react-native';
export default function Screen() {
const { width } = useWindowDimensions();
const isWide = width >= 840;
return (
<View style={{ flex: 1, flexDirection: isWide ? 'row' : 'column' }}>
{/* nội dung */}
</View>
);
}
Hook useWindowDimensions tự cập nhật khi xoay màn hình hoặc đổi kích thước cửa sổ.
Hãy xem bố cục như thứ co giãn theo không gian chứ không phải bản vẽ cố định. Chỉ cần dùng ràng buộc linh hoạt, vài điểm ngắt hợp lý và kiểm thử trên nhiều kích thước là ứng dụng của bạn đã chuyên nghiệp hơn nhiều.
Cách làm lười là kéo giãn giao diện điện thoại ra toàn màn hình, khiến nút to bất thường và dòng chữ quá dài. Thay vào đó hãy tận dụng không gian: hiển thị danh sách và chi tiết cạnh nhau, dùng lưới nhiều cột, đặt chiều rộng tối đa cho nội dung đọc. Chỉ vài điều chỉnh như vậy đã làm ứng dụng trông được chăm chút và đáp ứng yêu cầu chất lượng của cửa hàng cho thiết bị màn hình lớn.
Muốn thực hành thiết kế giao diện thích ứng qua dự án, bạn có thể tham khảo các khóa học tại codebem.com.
Nguyễn Đình Cường
0 comment