自适应注意事项

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

通过下面简短的配置设置和 API 列表,您可以构建自适应应用。但某些过时的设置和 API 与自适应应用不兼容,必须避免使用。

尺寸可调整性

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

<activity><application> 清单元素的 resizeableActivity 属性可在 Android 11(API 级别 30)及更低版本中启用或停用多窗口模式。在 Android 12(API 级别 31)及更高版本中,无论此属性如何,大屏设备都支持多窗口模式。如需了解详情,请参阅支持多窗口模式

✓ 正确做法

让您的应用能够参与多窗口、多任务处理场景,从而提高用户效率和满意度。

如果您的应用以低于 24 的 API 级别为目标平台,请设置 resizeableActivity="true";否则,请忽略它 - 在 Android 7.0(API 级别 24)及更高版本中,它默认为 true

✗ 不应

请勿为任何 API 级别设置 resizeableActivity="false"。请勿将您的应用从涉及多窗口模式的用例中排除。

方向

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

screenOrientation 清单设置会限制 activity 的屏幕方向。

✓ 正确做法

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

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

✗ 不应

请勿限制 activity 屏幕方向。在兼容的窗口大小的大屏设备上,锁定屏幕方向的应用会以宽屏显示。

采用信箱模式的应用在 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 专为开发自适应界面而设计。没有 XML、布局文件和资源限定符。只需使用基于 Kotlin 的无状态可组合项(例如用于描述界面的 ColumnRowBox),以及用于向界面元素添加行为的修饰符(例如 offsetpaddingsize)。

✓ 正确做法

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

✗ 不应

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

Compose Material 3 自适应库

Compose Material 3 自适应库提供了有助于开发自适应应用的组件和 API。

✓ 正确做法

使用以下 API 可让应用自适应:

✗ 不应

不要重复造轮子。不要错过所有 Jetpack Compose 库带来的开发者工作效率提升。

布局

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

自适应应用会根据显示屏的变化(尤其是应用窗口大小的变化或设备折叠状态的变化)优化布局。

✓ 正确做法

随着窗口大小的变化更改界面组件,以充分利用可用的显示空间。例如,在紧凑型窗口大小上使用底部导航栏,在中等和展开式窗口上使用垂直侧边导航栏。重新定位对话框,以便在所有显示屏上都能访问。

将内容整理到窗格中,以便实现列表-详情和辅助窗格等多窗格布局,以便显示动态内容。

✓ 正确做法:将列表 activity 和详情 activity 以双窗格布局的形式进行整理。
✗ 不应

如果您不使用内容窗格,请勿仅仅为了填充可用的显示空间而拉伸界面元素。长行文字难以阅读。经过拉伸的按钮看起来设计欠佳。如果您使用 Modifier.fillMaxWidth,请勿假定它适用于所有显示大小。

✗ 不建议:布局会拉伸以填充展开的窗口。

输入设备

用户不仅可以使用触摸屏与应用互动。

自适应应用支持外接键盘、鼠标和触控笔,可提供增强型用户体验,并帮助用户在各种外形规格的设备上提高工作效率。

✓ 正确做法

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

使用 Jetpack Material 3 库,让用户能够使用触控笔写入任何 TextField 组件。

✗ 不应

请勿禁止使用其他输入法。请勿引入无障碍问题。

摘要

  • 使用 Compose 和 Material 3 Adaptive 库构建应用
  • 基于窗口大小类别的布局
  • 创建多窗格布局
  • 使应用尺寸可调整
  • 永不锁定 activity 屏幕方向
  • 不限制宽高比
  • 支持除触控以外的输入
  • 避免使用已废弃的 API

✓ 满足用户的预期:针对用户每天使用的各种设备优化应用。

✗ 不要等待。立即开始体验吧!