https://developer.android.com/guide/practices/screens-distribution
设备兼容性和应用兼容性
如需了解您可以用来通过 Google Play 商店控制应用对用户是否可用的所有过滤器,请参阅 Google Play 上的过滤器文档。
平台版本
- 不同的设备可能会运行不同版本的 Android 平台
- 每个后续的平台版本通常会添加之前版本中不可用的新 API。
- 为表明可用的 API 集,每个平台版本都会指定 API 级别。
- 通过 API 级别,您可以使用
<uses-sdk>
清单标记及其minSdkVersion
属性来声明应用兼容的最低版本 -
minSdkVersion
属性声明应用兼容的最低版本,targetSdkVersion
属性声明应用经过优化后适用的最高版本。 - 不过,请注意
<uses-sdk>
元素中的属性会被替换为build.gradle
文件中的相应属性 - 如果您使用的是 Android Studio,则必须在其中指定 minSdkVersion 和 targetSdkVersion 值
- 要详细了解
build.gradle
文件,请参阅如何配置编译版本
屏幕配置
为了简化不同的配置,Android 将这些变体归纳成组,使它们更容易作为定位目标:
四种广义的尺寸:小、标准、大和特大。
还有几种广义的密度:mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)等。
如需了解如何针对不同屏幕创建备用资源以及如何在必要时将应用限制为特定屏幕尺寸,请参阅支持不同屏幕。
应用兼容
如需了解如何针对各种不同屏幕构建应用的具体说明,请参阅以下页面:
屏幕尺寸
屏幕尺寸是系统为您的应用界面所提供的可见空间。 应用的屏幕尺寸并非设备的实际屏幕尺寸,而是综合考虑屏幕方向、系统装饰(如导航栏)和窗口配置更改(例如,当用户启用多窗口模式时)后的尺寸。
灵活布局
默认情况下,Android 会调整应用布局的大小以适应当前屏幕。 为确保布局调整能很好地适应屏幕尺寸的微小变化,您需要灵活地实现布局。 您必须遵循一项核心原则,即避免对界面组件的位置和大小进行硬编码。 您应允许拉伸视图尺寸并指定视图相对于父视图或其他同级视图的位置,这样即便布局扩大,您期望的顺序和相对大小也会保持不变。
使用 ConstraintLayout
如需创建适用于不同屏幕尺寸的自适应布局,最佳做法是将
ConstraintLayout
用作界面中的基本布局。
-
使用
ConstraintLayout
,您可以根据布局中视图之间的空间关系指定每个视图的位置和大小 -
通过ConstraintLayout这种方式,当屏幕尺寸改变时,所有视图都可以一起移动和拉伸。
-
使用
ConstraintLayout
构建布局,最简单的方法是使用 Android Studio 中的布局编辑器。借助该工具,您可以将新视图拖动到布局中,将其约束条件附加到父视图和其他同级视图以及修改视图的属性,完全不必手动修改任何 XML(请参见图 1)。 -
如需了解详情,请参阅使用 ConstraintLayout 构建自适应界面。
-
但是,
ConstraintLayout
并不能解决所有布局场景(特别是动态加载的列表,对于此类布局,应使用 RecyclerView
避免使用硬编码的布局尺寸
为了确保布局能够灵活地使用不同的屏幕尺寸。
- "wrap_content" 指示视图将其尺寸设为适配该视图中相应内容所需的尺寸。
- "match_parent" 使视图在父视图中尽可能地展开
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/lorem_ipsum" />
使用
ConstraintLayout
时,不得使用match_parent
。而应将尺寸设为0dp
以启用一种称为“匹配约束”的特殊行为,该行为通常与match_parent
的预期行为相同。如需了解详情,请参阅如何调整 ConstraintLayout 中的视图尺寸。
备用布局
灵活布局非常重要,但您还应设计不同的布局,以便根据不同设备(如手机和平板电脑)上的可用空间优化用户体验。 因此,Android 允许您提供备用布局文件,而系统会在运行时根据当前设备的屏幕尺寸应用这些文件。
您为手机设计的界面或许无法在平板电脑上提供良好的体验。因此,您的应用还应提供备用布局资源,以针对特定屏幕尺寸优化界面设计。
您可以通过创建额外的 res/layout/ 目录提供特定于屏幕的布局(针对需要不同布局的每种屏幕配置创建一个目录),然后将屏幕配置限定符附加到 layout 目录名称(例如,对于可用宽度为 600dp 的屏幕,附加限定符为 layout-w600dp)。
这些配置限定符表示应用界面可用的可见屏幕空间。从应用中选择布局时,系统会考虑所有系统装饰(例如导航栏)和窗口配置更改。
使用最小宽度限定符
-
使用“最小宽度”屏幕尺寸限定符,您可以为具有最小宽度(以密度无关像素 dp 或 dip 为度量单位)的屏幕提供备用布局
-
通过将屏幕尺寸描述为密度无关像素的度量值,Android 允许您创建专为非常具体的屏幕尺寸而设计的布局,同时让您不必对不同的像素密度有任何担心。
例如,您可以创建一个名为 main_activity 且针对手机和平板电脑进行了优化的布局,方法是在目录中创建该文件的不同版本,如下所示:
res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-sw600dp/main_activity.xml # For 7” tablets (600dp wide and bigger)
最小宽度限定符指定屏幕两侧的最小尺寸,而不考虑设备当前的屏幕方向,因此这是一种指定布局可用的整体屏幕尺寸的简单方法。
下面是其他最小宽度值与典型屏幕尺寸的对应关系:
320dp:典型手机屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。
480dp:约为 5 英寸的大手机屏幕 (480x800 mdpi)。
600dp:7 英寸平板电脑 (600x1024 mdpi)。
720dp:10 英寸平板电脑(720x1280 mdpi、800x1280 mdpi 等)。
请记住,最小宽度限定符的所有数值都是密度无关像素,因为重要的是系统考虑像素密度(而不是原始像素分辨率)之后可用的屏幕空间量。
使用可用宽度限定符
您可能希望根据当前【可用的宽度或高度】来更改布局,而不是根据屏幕的【最小宽度】来更改布局。
您可能希望根据当前可用的宽度或高度来更改布局,而不是根据屏幕的最小宽度来更改布局:
res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-w600dp/main_activity.xml # For 7” tablets or any screen with 600dp
# available width (possibly landscape handsets)
如果您关心可用高度,则可以使用“可用高度”限定符来执行相同的操作。例如,对于屏幕高度至少为 600dp 的屏幕,请使用限定符 layout-h600dp。
添加屏幕方向限定符
虽然您可能只需将“最小宽度”和“可用宽度”限定符结合使用即可支持所有尺寸变化,但是您可能还希望当用户在纵向与横向之间切换屏幕方向时改变用户体验。
为此,您可以将 port 或 land 限定符添加到资源目录名称中。只需确保这些限定符在其他尺寸限定符后面即可。例如:
res/layout/main_activity.xml # For handsets
res/layout-land/main_activity.xml # For handsets in landscape
res/layout-sw600dp/main_activity.xml # For 7” tablets
res/layout-sw600dp-land/main_activity.xml # For 7” tablets in landscape
如需详细了解所有屏幕配置限定符,请参阅提供资源指南中的表 2。
使用Fragment 将界面组件模块化
在针对多种屏幕尺寸设计应用时,您希望确保不会在 Activity 之间不必要地重复界面行为。因此,您应该使用 Fragment将界面逻辑提取到单独的组件中。然后,您可以组合 Fragment 以便在大屏幕设备上运行时创建多窗格布局,或者在手机上运行时将 Fragment 放置在单独的 Activity 中。
如需了解详情,请参阅使用 Fragment 构建动态界面。
可拉伸图像(创建可拉伸的九宫格位图)
针对所有屏幕尺寸进行测试
务必针对各种屏幕尺寸测试您的应用,以便确保界面正确缩放。如果您无法访问具有各种不同屏幕尺寸的物理设备,则可以使用 Android 模拟器模拟任何屏幕尺寸。
如果您希望在物理设备上进行测试,但又不想购买设备,则可以使用 Firebase 测试实验室访问 Google 数据中心内的设备。
声明特定的屏幕尺寸支持
如果您不想让您的应用以特定的屏幕尺寸运行,您可以设置屏幕尺寸限制,甚至可以根据设备的屏幕配置限制哪些设备可以安装您的应用。如需了解详情,请参阅声明受限屏幕支持。
声明最大宽高比
- 为了支持尽可能多的设备,应用应动态调整其布局,以确保其内容和控件可见且安排合理。
-
多窗口模式适用于在 Android 7.0(API 级别 24)或更高版本中运行的所有应用,并且应用默认可调整大小。
您还可以为整个应用或特定 Activity 明确设置属性android:resizeableActivity true
。
如果您不希望自己的应用或 Activity 在多窗口模式下运行,请设置 android:resizeableActivity false。 - 如果您的应用布局无法适应宽高比过大的屏幕,则您可以通过设置最大宽高比显式强行要求在所有 Android 操作系统级别上采用宽屏显示。我们建议使用 2.4 (12:5) 的比例。
限制应用仅支持平板电脑或电视
您可以使用 <supports-screens>
清单元素来阻止手机设备下载您的应用。
<manifest ... >
<supports-screens android:smallScreens="false"
android:normalScreens="false"
android:largeScreens="true"
android:xlargeScreens="true"/>
...
</manifest>
限制应用仅支持特定尺寸和密度
您可以使用 <compatible-screens>
清单元素来指定应用支持的确切屏幕尺寸和密度。但是,我们强烈建议您不要使用此功能,因为您未指定的任何尺寸和密度组合都会被视为与您的应用不兼容的屏幕配置。因此,使用此元素很容易为应用屏蔽掉很多实际支持安装此应用的设备。
<manifest ... >
<compatible-screens>
<!-- all small size screens -->
<screen android:screenSize="small" android:screenDensity="ldpi" />
<screen android:screenSize="small" android:screenDensity="mdpi" />
<screen android:screenSize="small" android:screenDensity="hdpi" />
<screen android:screenSize="small" android:screenDensity="xhdpi" />
<!-- all normal size screens -->
<screen android:screenSize="normal" android:screenDensity="ldpi" />
<screen android:screenSize="normal" android:screenDensity="mdpi" />
<screen android:screenSize="normal" android:screenDensity="hdpi" />
<screen android:screenSize="normal" android:screenDensity="xhdpi" />
</compatible-screens>
...
<application ... >
...
<application>
</manifest>
网友评论