当您请求要为其提供备用资源的资源时,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
中选择可绘制对象。
系统使用以下逻辑决定要使用的资源:
图 2. Android 如何查找最佳匹配资源的流程图。
例外:屏幕像素密度是唯一一个未因冲突而被淘汰的限定符。 尽管设备的屏幕密度为 hdpi,但是 drawable-port-ldpi/
未被淘汰,因为此时每个屏幕密度均视为匹配。
例外:如果涉及的限定符是屏幕像素密度,则 Android 会选择最接近设备屏幕密度的选项。通常,Android 倾向于缩小大型原始图像,而不是放大小型原始图像。
- 淘汰与设备配置冲突的资源文件。
drawable-fr-rCA/
目录与en-GB
语言区域冲突,因而被淘汰。 - 选择列表(表 2)中(下一个)优先级最高的限定符。(先从 MCC 开始,然后下移。)
- 是否有资源目录包括此限定符?
- 若无,请返回到第 2 步,看看下一个限定符。(在该示例中,除非达到语言限定符,否则答案始终为“否”。)
- 若有,请继续执行第 4 步。
- 淘汰不含此限定符的资源目录。在该示例中,系统会淘汰所有不含语言限定符的目录
- 返回并重复第 2 步、第 3 步和第 4 步,直到只剩下一个目录为止。在此示例中,屏幕方向是下一个判断是否匹配的限定符。因此,未指定屏幕方向的资源被淘汰: