自适应注意事项

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

通过简短的配置设置和 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 屏幕方向。如果应用锁定屏幕方向,则在大屏设备和不兼容的窗口尺寸下,应用会呈现为信箱模式。

对于平板电脑、可折叠设备和 ChromeOS 设备,采用信箱模式的应用在 Google Play 上的曝光度会降低。

宽高比

随着屏幕和窗口尺寸的变化,其宽高比也会发生变化,从窄而长到方形,再到短而宽。

minAspectRatio 和 maxAspectRatio 清单设置会将应用的宽高比限制为硬编码的值。

✓ 正确做法

调整应用以适应显示屏,无论相对尺寸如何。

从应用清单中移除 minAspectRatio 和 maxAspectRatio 设置。或者确保应用可调整大小,并且宽高比会自动调整(请参阅可调整大小部分)。

✗ 错误做法

请勿尝试控制应用的相对尺寸。如果应用在宽高比与应用宽高比不兼容的屏幕或窗口中运行,应用会进入信箱模式。

在 Android 14(API 级别 34)及更高版本中,用户可以替换应用宽高比,以展开进入信箱模式的应用,使其填满可用的显示区域。请参阅设备兼容性模式。

窗口大小

针对不同屏幕尺寸优化布局是自适应设计的核心前提。自适应应用侧重于应用窗口大小,而不是设备屏幕大小。当应用处于全屏状态时,应用窗口就是设备屏幕。

窗口大小类别提供了一种系统性的方法来确定和分类应用窗口的大小。通过在应用窗口大小类别发生变化时更改布局来调整应用。

✓ 正确做法

根据窗口大小类别评估应用窗口大小。

如需确定窗口大小类别,请使用 Compose Material 3 Adaptive 库的 currentWindowAdaptiveInfoV2() 顶级函数(该函数取代了已弃用的 currentWindowAdaptiveInfo() 函数)。如需了解详情,请参阅构建自适应应用。

✗ 错误做法

请勿忽视窗口大小类定义和内置 API 的实用性。请勿使用已弃用的 API 来计算窗口大小。

已弃用的 API

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

✓ 正确做法

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

✗ 错误做法

请勿使用以下已弃用的 Display API 来确定窗口大小:

写邮件

Jetpack Compose 专为自适应界面开发而设计。没有 XML、没有布局文件、没有资源限定符。仅基于 Kotlin 的无状态可组合项,例如描述界面的 Column、Row 和 Box,以及为界面元素添加行为的修饰符,例如 offset、padding 和 size。

✓ 正确做法

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

✗ 错误做法

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

Compose Material 3 自适应库

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

✓ 正确做法

使用以下 API 可使您的应用具有自适应性:

✗ 错误做法

不必从头开始。不要错过所有 Jetpack Compose 库带来的开发者工作效率提升。

布局

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

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

✓ 正确做法

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

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

✓ 建议:以双窗格布局整理列表 activity 和详情 activity。
✗ 错误做法

如果您不使用内容窗格,请勿仅拉伸界面元素来填充可用的显示空间。长文本行难以阅读。拉伸的按钮看起来设计不合理。如果您使用 Modifier.fillMaxWidth,请勿认为这是所有显示尺寸的正确行为。

✗ 不正确:布局拉伸以填充展开的窗口。

输入设备

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

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

✓ 正确做法

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

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

✗ 错误做法

不要使替代输入法无法使用。不会引入无障碍功能问题。

摘要

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

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

✗ 别再犹豫了。现在就开始使用吧!