Window Size Class — 什么是窗口尺寸类、尺寸分类和开发

作者: IT Sectr 发布日期: 2026-06-08 阅读时间: 9 分钟

Window Size Class 是来自 Jetpack WindowManager 的 API,它将应用程序窗口分为三类:Compact、Medium 和 Expanded。与检查物理分辨率或像素密度不同,这些类分析以 dp 为单位的可用宽度——这可以在任何设备上提供可预测的结果。根据 Android Developers Documentation (2025),由于 WindowManager,Window Size Class 已成为 Jetpack Compose 和 View 系统中自适应界面的标准。

要点

  • Window Size Class — 用于将窗口宽度分类为 Compact、Medium 和 Expanded 的 API。
  • Compact — 适用于宽度不超过 600 dp 的窄窗口的类,通常用于竖屏模式下的手机。
  • Medium — 适用于 600–840 dp 窗口的类,适用于竖屏平板电脑和横屏手机。
  • Expanded — 适用于 840 dp 以上宽窗口的类,出现在平板电脑和桌面上。
  • Material Design 3 使用 Window Size Class 作为自适应布局的基础。

什么是 Window Size Class?

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 宽度相同的设备将获得相同的类——界面将可预测地相同。

Android 窗口尺寸的三个类

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 如何工作

Window Size Class 根据应用程序窗口的当前以 dp 为单位的宽度计算,同时考虑系统元素——状态栏、导航面板、分屏中的屏幕分割。API 响应窗口配置的变化:设备旋转、进入多窗口模式、展开折叠设备。

要获取该类,使用来自 androidx.window 库的 WindowSizeClass 类。开发人员订阅 Flow(Kotlin)或 LiveData(Java),它会在每次窗口大小变化时自动更新类——无需手动处理 onConfigurationChanged。

分类分三个步骤进行。第一步——测量当前窗口宽度(像素)。第二步——通过 DisplayMetrics.density 转换为 dp。第三步——将获得的值与阈值比较:小于 600 dp — Compact,600–840 — Medium,840 以上 — Expanded。

kotlin
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass()

when (windowSizeClass.windowWidthSizeClass) {
    WindowWidthSizeClass.COMPACT -> // 紧凑宽度
    WindowWidthSizeClass.MEDIUM  -> // 中等宽度
    WindowWidthSizeClass.EXPANDED -> // 扩展宽度
}

除了宽度(windowWidthSizeClass),API 还提供窗口高度类(windowHeightSizeClass)——对于横屏方向和桌面窗口很有用。

Jetpack Compose 中的 Window Size Class

在 Jetpack Compose 中,Window Size Class 通过 currentWindowAdaptiveInfo() 函数使用,该函数返回带有宽度和高度类的 WindowAdaptiveInfo。此函数不仅考虑窗口大小,还考虑输入类型(键盘、鼠标、触控)——通过 WindowPosture 和 WindowLayoutInfo。

典型场景——根据类在布局之间切换。例如,在 Compact 上显示带有选择的 BottomSheet,在 Medium 上显示侧面板,在 Expanded 上显示永久性的 Navigation Drawer。

kotlin
@Composable
fun AdaptiveNavigation(windowSizeClass: WindowWidthSizeClass) {
    when (windowSizeClass) {
        WindowWidthSizeClass.COMPACT -> BottomNavigation()
        WindowWidthSizeClass.MEDIUM  -> NavigationRail()
        WindowWidthSizeClass.EXPANDED -> NavigationDrawer()
    }
}

在 Material Design 3 中,NavigationSuiteScaffold 组件会自动适应 Window Size Class——开发人员无需编写条件逻辑。

Window Size Class 与 Material Design 3

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 的大屏幕设计建议,无需额外工作。

常见问题

Window Size Class 与 Screen Size Buckets 有何不同?

Screen Size Buckets(small/large/xlarge)——基于物理屏幕尺寸的 Android 1.6–6.0 过时方法。Window Size Class 专注于以 dp 为单位的可用窗口宽度,并在窗口大小改变时实时工作。

是否需要在 Android 6 及更低版本上支持 Window Size Class?

Window Size Class 通过 Jetpack WindowManager 在 Android 7.0+ 上可用,带有向后兼容库。对于 Android 6 及更低版本——仅限 Compact,因为没有多窗口。通过 WindowMetrics 使用回退。

Window Size Class 在折叠设备上如何工作?

展开设备时,窗口宽度发生变化,Window Size Class 自动重新计算。由于可用区域的增加,类可以从 Compact 变为 Expanded。

可以在 XML(Views)中使用 Window Size Class 吗?

可以,通过 Activity 或 Fragment 中的 WindowManager。获取 WindowSizeClass 后,使用条件逻辑在 XML 布局之间切换或更改 View 的可见性。

WindowHeightSizeClass 使用什么阈值?

对于窗口高度,阈值不同:Compact — 不超过 480 dp,Medium — 480–900 dp,Expanded — 900 dp 以上。WindowHeightSizeClass 在横屏方向和桌面上很有用。

总结

  • Window Size Class — Jetpack WindowManager API,用于将窗口宽度分类为 Compact、Medium 和 Expanded。
  • Compact — 不超过 600 dp,单列界面,底部导航。
  • Medium — 600–840 dp,双列界面,导航栏。
  • Expanded — 840 dp 以上,多面板界面,导航抽屉。
  • Jetpack Compose — currentWindowAdaptiveInfo() 函数用于在运行时获取类。
  • Material Design 3 — 自适应组件自动响应 Window Size Class。
  • 结论 — Window Size Class 取代了传统的断点适配,使界面在所有设备上可预测。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读