以下内容节选自本书
当某种资源存在多个候选资源目录时,需要通过一种方式来找到最合适的资源。在Android的网站上提供了资源匹配的算法说明,让我们一起来学习。
下面我们通过一个实际的例子来学习这个算法的执行过程。假设res目录下存在着下列资源目录:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
同时假设有一台设备的配置如下:
Locale =en-GB
Screenorientation = port
Screenpixel density = hdpi
Touchscreen type = notouch
Primarytext input method = 12key
通过算法筛选后,最终使用的资源目录是:
drawable-en-port
.
系统进行选择依据的是下面的流程图演示的算法。我们依据这个算法来看看上面这个例子是如何得到最终的结果的。
第一步:去掉和系统配置冲突的项。
上面的例子中有两项冲突:
目录“drawable-fr-rCA/” 和配置“Locale = en-GB”冲突;目录“drawable-port-ldpi/”和配置“Screen pixel density= hdpi”冲突。但是在配置限度符表里讲过,对于DPI类的限定符,并不要求资源项和它精确匹配,所以这里第一次不能去掉“drawable-port-ldpi/”。
第二步:按顺序逐项检查配置限度符表,看是否有限定符存在于资源目录名中,如果存在,则去掉没有该限定符的目录。
1.
2.
drawable/
drawable-port-ldpi/
drawable-port-notouch-12key/
然后只剩下三项了:
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
接下来,一直到“屏幕方向 ” 才又找到匹配的限定符 “ port ”。上面三项去掉不含 “ port ”的两项。最后就只剩下 “ drawable-en-port/ ”。