Android 设备的形状和尺寸多种多样,因此应用的布局需要十分灵活。也就是说,布局应该从容应对不同的屏幕尺寸和方向,而不是为布局定义刚性尺寸,假定屏幕尺寸和宽高比是一定的。
如果能够支持尽可能多的屏幕,您的应用就可以在各种不同设备上运行,这样您就可以使用单个 APK 将其提供给最多的用户。此外,如果能够使您的应用灵活适应不同的屏幕尺寸,可确保您的应用可以处理设备上的窗口配置更改,例如,当用户启用多窗口模式时发生的窗口配置更改。
本页将向您介绍如何采用以下技巧来支持不同的屏幕尺寸:
- 使用允许布局调整大小的视图尺寸
- 根据屏幕配置创建备用界面布局
- 提供可以随视图一起拉伸的位图
但请注意,适应不同的屏幕尺寸并不一定会使您的应用与所有 Android 设备类型兼容。您应该采取其他措施来支持 Android Wear、Android TV、Android Auto 和 Chrome 操作系统设备。 有关针对不同屏幕构建界面的设计指南,请参阅自适应界面的 Material 指南。
创建灵活的布局
无论您首先要支持什么硬件配置文件,都需要创建一个能够灵活应对屏幕尺寸变化(即便是微小变化)的布局。
使用 ConstraintLayout
要创建适用于不同屏幕尺寸的自适应布局,最佳做法就是将 ConstraintLayout 用作界面中的基本布局。使用 ConstraintLayout,您可以根据布局中视图之间的空间关系来指定每个视图的位置和大小。通过这种方式,当屏幕尺寸改变时,所有视图都可以一起移动和拉伸。 要使用 ConstraintLayout 构建布局,最简单的方法就是使用 Android Studio 中的布局编辑器。借助该工具,您可以将新视图拖动到布局中、将其约束附加到父视图和其他同级视图,以及修改视图的属性,完全不必手动修改任何 XML(请参见图 1)。 有关详情,请参阅使用 ConstraintLayout 构建自适应界面。
图 1. Android Studio 中的布局编辑器,显示了一个 ConstraintLayout
文件
但是,ConstraintLayout
并不能解决所有布局场景(特别是动态加载的列表,对于此类布局,您应使用 RecyclerView),但无论您使用何种布局,都应该避免对布局尺寸进行硬编码(请参见下一节)。
避免使用硬编码的布局尺寸
为了确保布局能够灵活地适应不同的屏幕尺寸,您应该对大多数视图组件的宽度和高度使用 "wrap_content"
和 "match_parent"
,而不是硬编码的尺寸。
"wrap_content"
告知视图将尺寸设为让其能够容纳下相应内容所需的尺寸。
"match_parent"
使视图在父视图中尽可能地展开。
例如:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/lorem_ipsum" />
虽然此视图的实际布局取决于其父视图和任何同级视图中的其他属性,但是此 Te