适应性设计指南

适应性应用支持各种尺寸的显示器:整个设备屏幕、多窗口模式下的可调整大小窗口、纵向和横向方向,以及可折叠设备的折叠和展开显示屏。

一些配置设置和 API 可以帮助您构建适应性应用。但某些过时的设置和 API 与适应性应用不兼容,必须避免使用。

可调整大小性

适应性应用支持应用可调整大小性和多窗口模式。

resizeableActivity<application> 清单元素的一个属性,它可以在 Android 11(API 级别 30)及更低版本上启用或禁用多窗口模式。在 Android 12(API 级别 31)及更高版本上,大屏幕无论该属性如何设置都支持多窗口模式。如需了解更多信息,请参阅支持多窗口模式

✓ 应该

让您的应用支持多窗口、多任务场景,以提高用户生产力和满意度。

如果您的应用目标 API 级别低于 24,请设置 resizeableActivity="true";否则,无需设置,因为在 Android 7.0(API 级别 24)及更高版本上,该属性默认为 true

✗ 不应该

不要为任何 API 级别设置 resizeableActivity="false"。不要将您的应用排除在涉及多窗口模式的用例之外。

方向

适应性应用支持纵向和横向方向,无论显示尺寸或窗口模式如何。

screenOrientation 清单设置限制了 Activity 的方向。

✓ 应该

从您的应用清单中移除 screenOrientation 设置。

锁定应用方向并不能阻止窗口大小的更改。当应用进入多窗口模式、设备折叠或展开,或桌面式窗口调整大小时,应用都会被调整大小。您的应用必须支持窗口大小的更改,无论 screenOrientation 属性设置如何。

✗ 不应该

不要限制 Activity 方向。锁定方向的应用在大屏幕设备和不兼容的窗口尺寸上会被留白(letterboxed)。

留白应用在 Google Play 上对平板电脑、可折叠设备和 ChromeOS 设备的可见度会降低。

宽高比

随着屏幕和窗口尺寸的变化,它们的宽高比也会变化——从高窄型到方形,再到短宽型。

minAspectRatiomaxAspectRatio 清单设置将您的应用宽高比限制为硬编码值。

✓ 应该

使您的应用适应显示屏,无论其相对尺寸如何。

从您的应用清单中移除 minAspectRatiomaxAspectRatio 设置。或者确保您的应用是可调整大小的,这样宽高比问题就会自行解决(请参阅可调整大小性部分)。

✗ 不应该

不要试图控制您的应用的相对尺寸。如果您的应用在屏幕或窗口上的宽高比与应用本身的宽高比不兼容,您的应用就会被留白。

在 Android 14(API 级别 34)及更高版本上,用户可以覆盖应用宽高比,以将留白应用扩展到填充可用显示区域。请参阅设备兼容模式

窗口尺寸

为不同显示尺寸优化布局是适应性设计的核心前提。适应性应用侧重于应用窗口尺寸,而不是设备屏幕尺寸。当应用全屏显示时,应用窗口就是设备屏幕。

窗口尺寸类别提供了一种系统化的方法来确定和分类应用窗口的大小。根据应用窗口尺寸类别的变化,通过更改布局来适应您的应用。

✓ 应该

根据窗口尺寸类别评估您的应用窗口尺寸。

要确定窗口尺寸类别,请使用 Compose Material 3 适应性库的顶层函数 currentWindowAdaptiveInfo()。如需了解更多信息,请参阅构建适应性应用

✗ 不应该

不要忽视窗口尺寸类别定义和内置 API 的实用性。不要使用已弃用的 API 来计算窗口尺寸。

已弃用的 API

旧的平台 API 无法正确测量应用窗口;有些测量设备屏幕,有些则排除系统装饰。

✓ 应该

使用 WindowManager#getCurrentWindowMetrics()WindowMetrics#getBounds() 来获取应用窗口的大小。使用 WindowMetrics#getDensity() 来获取显示密度。

✗ 不应该

不要使用以下已弃用的 Display API 来确定窗口大小

Compose

Jetpack Compose 专为适应性 UI 开发而设计。没有 XML,没有布局文件,也没有资源限定符。只有基于 Kotlin 的无状态可组合项,例如描述您的 UI 的 ColumnRowBox,以及为 UI 元素添加行为的修饰符,例如 offsetpaddingsize

✓ 应该

使用 Compose 构建。及时了解最新功能和版本。

✗ 不应该

不要依赖过时的技术。不要让您的应用过时。

Compose Material 3 适应性库

Compose Material 3 适应性库提供组件和 API,方便适应性应用的开发。

✓ 应该

使用以下 API 让您的应用具有适应性

✗ 不应该

不要重复造轮子。不要错过所有 Jetpack Compose 库带来的开发者生产力提升。

布局

用户期望应用能够通过补充内容或增强控件充分利用可用的显示空间。

适应性应用根据显示屏的变化来优化布局,特别是应用窗口大小的变化或设备姿态的变化。

✓ 应该

随着窗口大小的变化更改 UI 组件,以利用可用的显示空间。例如,在紧凑型窗口尺寸上使用的底部导航栏可以替换为中等和展开型窗口上的垂直导航轨道。重新定位对话框,使其在所有显示屏上都可触及。

将内容组织成窗格,以实现多窗格布局,例如列表-详细信息和辅助窗格,用于动态内容显示。

✓ 应该: 以双窗格布局组织列表和详细信息 Activity。
✗ 不应该

如果您不使用内容窗格,不要仅仅拉伸 UI 元素来填充可用的显示空间。过长的文本行难以阅读。拉伸的按钮看起来设计糟糕。如果您使用 Modifier.fillMaxWidth,不要假设这适用于所有显示尺寸。

✗ 不应该: 布局拉伸以填充扩展窗口。

输入设备

用户不只通过触摸屏与应用交互。

适应性应用支持外部键盘、鼠标和手写笔,以提供增强的用户体验,并帮助用户在各种外形设备上提高生产力。

✓ 应该

利用 Android 框架的内置功能,实现键盘 Tab 导航以及鼠标或触控板的点击、选择和滚动。在键盘快捷键助手中发布您应用的键盘快捷键。

使用 Jetpack Material 3 库,让用户能够使用手写笔在任何 TextField 组件中进行书写。

✗ 不应该

不要让替代输入方法变得不可能。不要引入无障碍功能问题。

总结

  • 使用 Compose 和 Material 3 适应性库构建您的应用
  • 基于窗口尺寸类别构建布局
  • 创建多窗格布局
  • 使您的应用可调整大小
  • 永不锁定 Activity 方向
  • 不要限制宽高比
  • 支持非触摸输入
  • 避免使用已弃用的 API

✓ 应该 满足用户期望:为人们日常使用的多样化设备优化您的应用。

✗ 不要 等待。立即开始!