Window Size Class 是来自 Jetpack WindowManager 的 API,它将应用程序窗口分为三类:Compact、Medium 和 Expanded。与检查物理分辨率或像素密度不同,这些类分析以 dp 为单位的可用宽度——这可以在任何设备上提供可预测的结果。根据 Android Developers Documentation (2025),由于 WindowManager,Window Size Class 已成为 Jetpack Compose 和 View 系统中自适应界面的标准。
要点
Window Size Class 是 Android 平台的 API,属于 Jetpack WindowManager 库的一部分,它将应用程序窗口的可用空间分为三类。与使用资源限定符(small/large/xlarge)的传统方法不同,Window Size Class 提供了一组离散的值,开发人员在设计界面时可以依赖这些值。
该 API 出现在 Android 7.0 Nougat 中,作为多窗口模式支持的一部分,但积极实施始于 Jetpack WindowManager 1.1(2022)。Google 推荐使用 Window Size Class 作为构建自适应布局的主要工具,而不是通过 Display.getSize() 检查屏幕宽度。
分类基于以 dp 为单位的窗口宽度,而不是物理尺寸或像素密度。这意味着两个分辨率不同但 dp 宽度相同的设备将获得相同的类——界面将可预测地相同。
Compact — 适用于宽度不超过 600 dp 的窗口的类。竖屏模式下的手机,大多数折叠手机(Galaxy Z Flip)处于闭合状态。界面构建在一列中,通过 Bottom Navigation 进行导航。
Medium — 适用于宽度为 600–840 dp 的窗口的类。竖屏平板电脑、横屏手机、半开状态的折叠设备。界面使用两列——例如左侧列表和右侧详情。Navigation Rail 取代了 Bottom Navigation。
Expanded — 适用于宽度从 840 dp 起的窗口的类。横屏平板电脑、桌面窗口、展开状态的折叠设备。界面可以使用三个或更多面板、永久性 Navigation Drawer、工具栏。
在 Material Design 3 中,为每个类定义了自适应组件:Medium 使用 Navigation Rail,Expanded 使用 Navigation Drawer,Compact 使用 Bottom Navigation。开发人员不需要选择 breakpoints——它们已经由 API 设置好了。
Window Size Class 根据应用程序窗口的当前以 dp 为单位的宽度计算,同时考虑系统元素——状态栏、导航面板、分屏中的屏幕分割。API 响应窗口配置的变化:设备旋转、进入多窗口模式、展开折叠设备。
要获取该类,使用来自 androidx.window 库的 WindowSizeClass 类。开发人员订阅 Flow(Kotlin)或 LiveData(Java),它会在每次窗口大小变化时自动更新类——无需手动处理 onConfigurationChanged。
分类分三个步骤进行。第一步——测量当前窗口宽度(像素)。第二步——通过 DisplayMetrics.density 转换为 dp。第三步——将获得的值与阈值比较:小于 600 dp — Compact,600–840 — Medium,840 以上 — Expanded。
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass()
when (windowSizeClass.windowWidthSizeClass) {
WindowWidthSizeClass.COMPACT -> // 紧凑宽度
WindowWidthSizeClass.MEDIUM -> // 中等宽度
WindowWidthSizeClass.EXPANDED -> // 扩展宽度
}
除了宽度(windowWidthSizeClass),API 还提供窗口高度类(windowHeightSizeClass)——对于横屏方向和桌面窗口很有用。
在 Jetpack Compose 中,Window Size Class 通过 currentWindowAdaptiveInfo() 函数使用,该函数返回带有宽度和高度类的 WindowAdaptiveInfo。此函数不仅考虑窗口大小,还考虑输入类型(键盘、鼠标、触控)——通过 WindowPosture 和 WindowLayoutInfo。
典型场景——根据类在布局之间切换。例如,在 Compact 上显示带有选择的 BottomSheet,在 Medium 上显示侧面板,在 Expanded 上显示永久性的 Navigation Drawer。
@Composable
fun AdaptiveNavigation(windowSizeClass: WindowWidthSizeClass) {
when (windowSizeClass) {
WindowWidthSizeClass.COMPACT -> BottomNavigation()
WindowWidthSizeClass.MEDIUM -> NavigationRail()
WindowWidthSizeClass.EXPANDED -> NavigationDrawer()
}
}
在 Material Design 3 中,NavigationSuiteScaffold 组件会自动适应 Window Size Class——开发人员无需编写条件逻辑。
Material Design 3(Material You)与 Window Size Class 完全集成。Material 3 中的自适应布局系统确定在每个类中使用哪个导航组件:Compact 使用 BottomNavigation,Medium 使用 NavigationRail,Expanded 使用 NavigationDrawer。
这种集成在 Adaptive API 级别工作,它将 Window Size Class 与其他信号相结合——FoldState(折叠设备)和 WindowPosture(屏幕位置)。Adaptive API 通过 material3-adaptive 库提供。
Material 3 提供了四个高级自适应组件:ListDetailPaneScaffold、SupportingPaneScaffold、NavigationSuiteScaffold 和 AdaptiveSheet。每个组件都会根据 Window Size Class 改变其行为,无需额外配置。
| 类 | 导航组件 | 窗格脚手架 |
|---|---|---|
| Compact | 底部导航 | 隐藏面板 |
| Medium | 导航栏 | 滑出面板 |
| Expanded | 导航抽屉 | 永久面板 |
使用 Window Size Class 在移动开发中具有三个关键优势。第一——可预测性:开发人员无需处理数百种屏幕尺寸组合,而是使用三个类。这大大减少了测试场景的数量和与布局相关的 错误。
第二——自动适应多窗口模式。当用户进入分屏时,窗口宽度发生变化——Window Size Class 立即重新计算,界面进行适应。没有这个 API,应用程序在分屏上会显示被截断的手机界面版本。
第三——与 Material Design 3 的一致性。Google 已将 Window Size Class 嵌入到自适应组件系统中,因此基于 Material 3 构建的界面会自动遵循 Google 的大屏幕设计建议,无需额外工作。
常见问题
Screen Size Buckets(small/large/xlarge)——基于物理屏幕尺寸的 Android 1.6–6.0 过时方法。Window Size Class 专注于以 dp 为单位的可用窗口宽度,并在窗口大小改变时实时工作。
Window Size Class 通过 Jetpack WindowManager 在 Android 7.0+ 上可用,带有向后兼容库。对于 Android 6 及更低版本——仅限 Compact,因为没有多窗口。通过 WindowMetrics 使用回退。
展开设备时,窗口宽度发生变化,Window Size Class 自动重新计算。由于可用区域的增加,类可以从 Compact 变为 Expanded。
可以,通过 Activity 或 Fragment 中的 WindowManager。获取 WindowSizeClass 后,使用条件逻辑在 XML 布局之间切换或更改 View 的可见性。
对于窗口高度,阈值不同:Compact — 不超过 480 dp,Medium — 480–900 dp,Expanded — 900 dp 以上。WindowHeightSizeClass 在横屏方向和桌面上很有用。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。