自适应应用支持各种尺寸的显示屏:整个设备屏幕、多窗口模式下的可调整大小的窗口、纵向和横向方向、可折叠设备的折叠和展开显示屏。
少量配置设置和 API 可让您构建自适应应用。但某些过时的设置和 API 与自适应应用不兼容,必须避免。
可调整大小
自适应应用支持应用可调整大小和多窗口模式。
resizeableActivity
属性的 <activity>
和 <application>
清单元素在 Android 11(API 级别 30)及更低版本上启用或禁用多窗口模式。在 Android 12(API 级别 31)及更高版本上,无论属性如何,大屏幕都支持多窗口模式。有关更多信息,请参阅 支持多窗口模式。
使您的应用能够参与多窗口、多任务场景,以提高用户效率和满意度。
如果您的应用面向低于 24 的 API 级别,请设置 resizeableActivity="true"
;否则,忽略它——在 Android 7.0(API 级别 24)及更高版本上,它默认值为 true
。
不要为任何 API 级别设置 resizeableActivity="false"
。不要将您的应用排除在涉及多窗口模式的用例之外。
方向
自适应应用支持纵向和横向方向,无论显示大小或窗口模式如何。
screenOrientation
清单设置限制活动方向。
从您的应用清单中删除 screenOrientation
设置。
锁定应用的方向并不能阻止窗口大小变化。当应用进入多窗口模式、设备折叠或展开,或调整桌面类型窗口的大小时,应用会调整大小。无论 screenOrientation
属性设置如何,您的应用都必须支持窗口大小的变化。
不要限制活动方向。锁定方向的应用在大型屏幕设备上会被加黑边,并且与窗口大小不兼容。
在平板电脑、可折叠设备和 ChromeOS 设备上,加黑边的应用在 Google Play 上的发现率会降低。
纵横比
随着屏幕和窗口大小的变化,它们的纵横比也会变化——从又高又窄,到正方形,到又矮又宽。
minAspectRatio
和 maxAspectRatio
清单设置将您的应用的纵横比限制为硬编码值。
使您的应用适应显示,而不管相对尺寸如何。
从您的应用清单中删除 minAspectRatio
和 maxAspectRatio
设置。或者确保您的应用可调整大小,纵横比会自行处理(请参阅 可调整大小 部分)。
不要试图控制您的应用的相对尺寸。如果您的应用在一个屏幕或窗口上运行,其纵横比与应用的纵横比不兼容,则您的应用会被加黑边。
在 Android 14(API 级别 34)及更高版本上,用户可以覆盖应用纵横比,以将加黑边的应用扩展到填充可用显示区域。请参阅 设备兼容性模式。
窗口大小
针对不同显示大小优化布局是自适应设计的核心前提。自适应应用关注应用窗口大小而不是设备屏幕大小。当应用全屏时,应用窗口就是设备屏幕。
窗口大小类 提供了一种系统的方法来确定和分类应用窗口的大小。通过更改布局来适应应用窗口大小类发生变化的应用。
根据窗口大小类评估您的应用窗口大小。
要确定窗口大小类,请使用 Compose Material 3 自适应库的 currentWindowAdaptiveInfo()
顶级函数。有关更多信息,请参阅 构建自适应应用。
不要忽略窗口大小类定义和内置 API 的实用性。不要使用已弃用的 API 来计算窗口大小。
已弃用的 API
较旧的平台 API 无法正确测量应用窗口;有些测量设备屏幕,有些排除系统装饰。
使用 WindowManager#getCurrentWindowMetrics()
和 WindowMetrics#getBounds()
获取应用窗口的大小。使用 WindowMetrics#getDensity()
获取显示密度。
不要使用以下已弃用的 Display
API 来确定窗口大小
getSize()
:已在 Android 11(API 级别 30)中弃用getMetrics()
:已在 Android 11(API 级别 30)中弃用getRealSize()
:已在 Android 12(API 级别 31)中弃用getRealMetrics()
:已在 Android 12(API 级别 31)中弃用
Compose
Jetpack Compose 专为自适应 UI 开发而设计。无需 XML,无需布局文件,无需资源限定符。只需基于 Kotlin 的无状态可组合项,如 Column
、Row
和 Box
来描述您的 UI,以及诸如 offset
、padding
和 size
之类的修饰符来为 UI 元素添加行为。
使用 Compose 构建。随时了解最新的功能和版本。
不要依赖过时的技术。不要让您的应用过时。
Compose Material 3 自适应库
Compose Material 3 自适应库 提供了有助于开发自适应应用的组件和 API。
使用以下 API 使您的应用具有自适应性
NavigationSuiteScaffold
:根据应用窗口大小类在导航栏和导航栏之间切换。ListDetailPaneScaffold
:实现列表-详情规范布局。使布局适应应用窗口大小。SupportingPaneScaffold
:实现支持窗格规范布局。
不要重新发明轮子。不要错过所有 Jetpack Compose 库提供的开发者效率提升。
布局
用户期望应用充分利用可用的显示空间,提供补充内容或增强的控件。
自适应应用会根据显示屏的变化优化布局,特别是应用窗口大小或设备姿势的变化。
随着窗口大小的变化,更改UI组件以利用可用的显示空间。例如,在紧凑型窗口大小下使用的底部导航栏,可以在中等和扩展窗口中替换为垂直导航栏。重新定位对话框,以便在所有显示屏上都能访问。
将内容组织成窗格,以启用多窗格布局,例如列表-详细信息和支持窗格,用于动态内容显示。
如果您不使用内容窗格,请不要仅仅拉伸UI元素以填充可用的显示空间。长文本行难以阅读。拉伸的按钮看起来设计得很差。如果您使用Modifier.fillMaxWidth
,请不要认为这对于所有显示尺寸都是正确的行为。
输入设备
用户不仅仅使用触摸屏与应用交互。
自适应应用支持外接键盘、鼠标和触笔,以提供增强的用户体验,并帮助用户在各种尺寸的设备上提高生产力。
利用Android框架的内置功能进行键盘选项卡导航以及鼠标或触控板的点击、选择和滚动。在键盘快捷键助手中发布您的应用的键盘快捷键。
使用Jetpack Material 3库 使用触笔,使用户能够写入任何TextField
组件。
不要使替代输入方法变得不可能。不要引入辅助功能问题。
总结
- 使用Compose和Material 3自适应库构建您的应用
- 基于窗口大小类创建布局
- 创建多窗格布局
- 使您的应用可调整大小
- 切勿锁定活动方向
- 不要限制纵横比
- 支持除触摸之外的输入
- 避免使用已弃用的API
✓ 执行 用户期望的操作:为人们每天依赖的各种设备优化您的应用。
✗ 不要 等待。立即开始吧!