当我们将一些提供了不同的资源文件可供Android系统选择的时候,Android会在运行时会根据一套适配的规则选择最符合当前配置的资源。为了说明Android怎么选择资源,假设我们有以下可选的资源文件目录,每一个目录都包含同一张图片的不同版本。

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

假设系统配置是下面这样的:

Locale = en-GB 
Screen orientation = port 
Screen pixel density = hdpi 
Touchscreen type = notouch 
Primary text input method = 12key

在将系统配置与可选的资源对比之后,Android选择drawable-en-port/

Android根据下面的逻辑去选择资源

1、排除跟系统配置不同的资源文件

drawable-fr-rCA/被排除了,因为它违背了Locale=en-GB。

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

例外:屏幕像素密度(Screen pixel density) 这种限定词不会简单地因为跟当前系统配置不同而被排除。即使当前屏幕的配置是hdpi,drawable-port-ldpi/不会被排除,因为每种屏幕密度都被认为可适配的。更多相关的信息查看Supporting Multiple Screens.

2、选出列表中(下一个)最高优先级限定词(开始于MCC,然后越往下越低)。

3、是否还有包含这个限定词的资源目录?

●否,返回步骤2然后查找下一个限定词(在例子中,答案是否,直到语言限定词被找到)。

●是,继续第4步。

4、排除没有包含这个限定词的资源文件目录。在这个例子中,系统排除了所有没有包含语言限定词的目录:

drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

例外:如果限定词是屏幕像素密度(device screen density),Android会选择最接近屏幕像素密度的一个。 总之,Android比较偏向于将原始的大图片缩放成 小的图片。 参考 Supporting Multiple Screens.

5、返回重复步骤2,3,和4知道只剩下一个目录。在这个例子中,屏幕方向是下一个用来匹配资源的限定词。所以,没有限定屏幕方向的资源文件目录就被排除了。

drawable-en/
drawable-en-port/
drawable-en-notouch-12key/

最后剩下的目录是drawable-en-port

虽然在请求每一个资源文件的时候都会执行上述的处理过程,但是系统自己会进行查找过程的优化。其中一个优化就是一旦系统的配置已经被加载,它可能会排除掉永远不会匹配的可选资源。比如,如果配置中的语言为英语(“en"),那么任何其他有语言限定词又不是英语的就会从可选的资源目录池当中排除(但是如果资源目录中没有语言限定词,那么它依然是可选的)。

当根据屏幕大小选择资源的时候,如果找不到能跟当前屏幕匹配的资源,为比当前更小的屏幕设计的资源就会被使用(比如,一个large-size屏幕将会在必要的时候使用normal-size屏幕的资源文件)。然而,如果唯一可选的资源比当前的屏幕大,系统不会使用它们并且你的程序会崩溃如果没有其他的资源能够跟系统配置匹配(比如,所有的layout资源都有xlarge的限定,但是当前的设备屏幕是normal-size的)。

注意:在准确匹配资源上,限定词的优先级(在表2)比限定词的数量更重要。例如,在上面的步骤4,列表中的最后一项还包含了三种能够准确匹配系统配置的资源(orientation、touchscreen type和input method),然而drawable-en那项只有一项匹配(语言)。然而,语言有比其他限定词更高的优先级,所以drawable-port-notouch-12key就被排除了。

本文翻译自How Android Finds the Best-matching Resource

Android怎么找到最优适配资源的更多相关文章

  1. Android开发者必知的开发资源

    推荐书籍 我推荐下面两本书: The Busy Coder’s Guide to Android Development <The Busy Coder’s Guide to Android D ...

  2. (转载)Android开发者必知的开发资源

    (转载)http://www.importnew.com/3988.html 随着Android平台市场份额的持续猛增 ,越来越多的开发者开始投入Android应用程序的开发大潮.如果您是一位2013 ...

  3. Android 如何引用com.android.internal.R目录下的资源

    Android 如何引用com.android.internal.R目录下的资源 项目需求 有一个资源跟系统上的一个资源相同,想要引用它:frameworks/base/core/res/res/dr ...

  4. Python 制作Android开发 所需的适配不同分辨率的套图

    使用Python做起工具来还真是爽,简单,方便,快捷.今天忙活了一下,制作出一个比较实用的小工具. 自动化套图制作,适配不同屏幕 尤其是对于android开发来说,要适配不同屏幕就需要多套切图,那么. ...

  5. android imageview使用的时候 引用资源src和background的区别

    android imageview使用的时候 引用资源时src和background的区别 src更强调内容并且不行拉伸图片进行适配,而background更注重引用图片,会对图片进行拉伸

  6. [转][赞]Android开发者必知的开发资源

    英文原文:Bongzimo  翻译: ImportNew-黄小非 随着Android平台市场份额的持续猛增 ,越来越多的开发者开始投入Android应用程序的开发大潮.如果您是一位2013年刚刚入行的 ...

  7. Android 开发者必知的开发资源

    英文原文:Bongzimo  翻译: ImportNew-黄小非 译文链接:http://www.importnew.com/3988.html Android 开发者必知的开发资源 随着Androi ...

  8. Android 文件夹命名规范 国际化资源

    Android 文件夹命名规范 国际化资源 android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values- ...

  9. android学习笔记40——国际化和资源自适应

    国际化——Internationalization,简称I18N. 本地化——Localization,检查L10N. java国际化资源的思路: java提供国际化资源的思路,是将程序中的标签.提示 ...

随机推荐

  1. .Net WinForm下配置Log4Net(总结不输出原因)

    最近做一个winform项目,配置了Log4net 但是总是不能输出,搜索了很多文章加上自己的探索发现自己在项目中添加的 Log4Net.config 生成时没有被复制到Debug文件夹下, 所以程序 ...

  2. k次出现与一次出现的数字

    原始的题目是这样的: Single Number II Given an array of integers, every element appears three times except for ...

  3. C# 微信v3退款

    1.退款需要退款证书.C#都是用p12的证书,双击证书导入,密码是mch_id(商户号) 2.调用微信退款接口进行退款操作 string resp=string.Empty string cert = ...

  4. js 字符串格式化方法

    String.prototype.format = function(args) { var result = this; if (arguments.length > 0) { if (arg ...

  5. Fire

    Fire 分析: 首先,明确题意:b1,b2,--,bn 交换为b2,--,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...

  6. Sublime Text 3 Install Markdown Preview Plugins

    Sublime Text 3 Install Markdown Preview Plugins. [TOC] 前言 什么是Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言, ...

  7. MYSQL绿色安装过程

    # These are commonly set, remove the # and set as required. basedir = "D:\Program Files\mysql-5 ...

  8. jQuery in action 3rd - Working with properties, attributes, and data

    properties properties 是 JavaScript 对象内在的属性,可以进行动态创建,修改等操作. attributes 指的是 DOM 元素标记出来的属性,不是实例对象的属性. 例 ...

  9. 搜索引擎 ElasticSearch 之 步步为营1 【环境搭建&初识ElasticSearch】

    1.下载ElasticSearch a.下载Java环境JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloa ...

  10. foremost

    foremost 恢复单个类型文件 删除一个 USB(/dev/sdba1)存储器中一个 png 文件然后使用 formost 恢复. #rm -f /dev/sdb1/1.png #foremost ...