Android如何查找最匹配的目录HowAndroid finds the bestmatching directory

Android 将从各种潜在的资源中挑选出哪个应该在运行时使用,这取决于设备的当前配置。

这里的例子假定使用了如下的设备配置:

区域Locale = en-GB

屏幕方向Screen orientation = port

屏幕像素密度Screen pixel density = 108dpi

触摸屏类型Touchscreen type = notouch

首选文本输入方式Primary text input method = 12key

下面说明了Android 如何作出选择:

  1. 排除和设备配置冲突的资源文件。比如,假定如下的drawables 资源目录可用。

那么drawable-fr-rCA/会被排除,因为它和设备的区域配置冲突。MyApp/res/drawable/ MyApp/res/drawable-en/ MyApp/res/drawable-fr-rCA/ MyApp/res/drawable-en-port/ MyApp/res/drawable-en-notouch-12key/ MyApp/res/drawable-port-92dpi/例外:屏幕像素密度是唯一不用来排除文件的限定符。即使设备屏幕密度是108dpi,drawable-port-92dpi/也不会被从列表中排除,因为在这里所有的屏幕密度都被视为匹配。

  1. 从表2 中选取最高优先级的限定符(从MCC 开始,然后自该列表依次往下)。

  2. 有没有哪个可用的资源目录包含了这个限定符?

如果没有,回到步骤2 然后查看表2 中所列的下一个限定符。在我们的例子中,答案是“没有”直到我们到达语言这一级。If No, return to step 2 and look at the next qualifier listed in Table 2. In our example, the answer is “no” until we reach Language;

如果有,则跳转到步骤4。

  1. 排除不包含这个限定符的资源目录,在我们的例子中,我们排除所有不包含语言的目录。MyApp/res/drawable/ MyApp/res/drawable-en/ MyApp/res/drawable-en-port/ MyApp/res/drawable-en-notouch-12key/ MyApp/res/drawable-port-92dpi/ MyApp/res/drawable-port-notouch-12key例外:如果询问中的限定符是屏幕像素密度,Android 会选择最接近匹配于设备的选项,而且选择过程将会完成。

一般而言,Android 会倾向于缩小一个大图片而不是放大一个小图片。

  1. 回头重复步骤2,3,4 直到只剩下一个选择。在本例中,屏幕方向是下一个要比较的限定符,我们排除没有指定屏幕方向的资源。现在只剩下一个选择,那就是它了。

当drawables被这个应用程序调用时,Android 系统会从下面这个目录中加载资源:

MyApp/res/drawable-en-port/

提示Tip: 限定符的优先权比匹配的数目要重要得多。

比如,在上面的步骤4 中,列表中最后的选项包含三个限定符和设备匹配(方向,触摸屏类型,和输入法),而drawable-en 只有一个参数匹配(语言)。

但是,语言拥有更高的优先权,所以drawable-port-notouch-12key 被排除出局。

下面的流程图总结了Android 如何选择资源目录来加载的过程: