Android res/layout中布局文件怎样管理( 八 )
同样,如果您根据屏幕方向提供不同的布局资源,则应选择一个方向作为默认方向。 例如,不要在 layout-land/ 和 layout-port/ 中分别提供横向和纵向的布局资源,而是保留其中之一作为默认设置,例如:layout/ 用于横向,layout-port/ 用于纵向。
提供默认资源至关重要,这不仅仅因为应用可能在超出预期的配置上运行,也因为新版 Android 有时会添加旧版本不支持的配置限定符。若要使用新的资源限定符,又希望维持对旧版 Android 的代码兼容性,则当旧版 Android 运行应用时,如果不提供默认资源,应用将会崩溃,这是因为它无法使用以新限定符命名的资源。例如,如果将 minSdkVersion 设置为 4,并使用夜间模式(night 或 notnight,API 级别 8 中新增配置)限定所有可绘制对象资源,则 API 级别 4 设备无法访问可绘制对象资源,而且会崩溃。在这种情况下,您可能希望 notnight 成为默认资源,为此,您应排除该限定符,使可绘制对象资源位于 drawable/ 或 drawable-night/ 中。
因此,为了提供最佳设备兼容性,请始终为应用正确运行所必需的资源提供默认资源。 然后,使用配置限定符为特定的设备配置创建备用资源。
这条规则有一个例外:如果应用的 minSdkVersion 为 4 或更高版本,则在提供带屏幕密度限定符的备用可绘制对象资源时,不需要默认可绘制对象资源。 即使没有默认可绘制对象资源,Android 也可以从备用屏幕密度中找到最佳匹配项并根据需要缩放位图。 但是,为了在所有类型的设备上提供最佳体验,您应该为所有三种类型的密度提供备用可绘制对象。
Android 如何查找最佳匹配资源当您请求要为其提供备用资源的资源时,Android 会根据当前的设备配置选择要在运行时使用的备用资源。为演示 Android 如何选择备用资源,假设以下可绘制对象目录分别包含相同图像的不同版本:drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/同时,假设设备配置如下:
语言区域 = en-GB 屏幕方向 = port 屏幕像素密度 = hdpi 触摸屏类型 = notouch 主要文本输入法 = 12key
通过将设备配置与可用的备用资源进行比较,Android 从 drawable-en-port 中选择可绘制对象。
系统使用以下逻辑决定要使用的资源:
https://developer.android.com/images/resources/res-selection-flowchart.png
图 2. Android 如何查找最佳匹配资源的流程图。
淘汰与设备配置冲突的资源文件。drawable-fr-rCA/ 目录与 en-GB 语言区域冲突,因而被淘汰。drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/ 例外:屏幕像素密度是唯一一个未因冲突而被淘汰的限定符。 尽管设备的屏幕密度为 hdpi,但是 drawable-port-ldpi/ 未被淘汰,因为此时每个屏幕密度均视为匹配。如需了解详细信息,请参阅支持多种屏幕文档。选择列表(表 2)中(下一个)优先级最高的限定符。(先从 MCC 开始,然后下移。)是否有资源目录包括此限定符?若无,请返回到第 2 步,看看下一个限定符。(在该示例中,除非达到语言限定符,否则答案始终为“否”。)若有,请继续执行第 4 步。淘汰不含此限定符的资源目录。在该示例中,系统会淘汰所有不含语言限定符的目录。drawable/drawable-en/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/例外:如果涉及的限定符是屏幕像素密度,则 Android 会选择最接近设备屏幕密度的选项。通常,Android 倾向于缩小大型原始图像,而不是放大小型原始图像。请参阅支持多种屏幕。
推荐阅读
- 怎样评价Google发布的Android P
- Android怎样在不Root的前提下阻止App互相唤醒
- 我的Android就渣到连面试的机会都没有嘛
- 在dribble和Pinterest等设计师网站上有哪些不得不关注的设计大神
- ActiveMQ、MQTT的方式进行Android消息推送,我的理解是否正确
- PCB Layout工程师转型
- 为啥防范xss要过滤发帖内容,照单全收后显示时直接放到\u003ciframe sandbox security=restrict\u003e中不就行了
- 华为海思有Android开发岗位吗
- android准备转大数据,有些疑问,求指导?
- 花瓣网和 Pinterest 在使用上有啥不同,Pinterest 采集工具咋添加到浏览器上
