Android應(yīng)用程序的資源選擇的規(guī)則一共有18種,如圖1:

具體可參考:http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources。這18個規(guī)則是按照優(yōu)先級從最大到小排列的,通過這些匹配規(guī)則,應(yīng)用程序就能選擇最佳的資源目錄。
在應(yīng)用程序中我們可以根據(jù)這些規(guī)則來命名資源目錄的名稱,例如:drawable-port-hdpi。這里要注意幾點:第一,這18個規(guī)則是有優(yōu)先級的,所以如果上面的例子寫成drawable-hdpi-port就會出問題;第二,資源目錄是不允許嵌套的,諸如res/drawable/drawable-en/形式的資源目錄都是不行的;第三,同一規(guī)則只能出現(xiàn)一次,諸如drawable-xhdpi-hdpi的命名是不允許的。
上面所說的注意點其實和Android的匹配算法有關(guān)系,圖2是官方給出的匹配算法,

下面用官方的例子來說明下這個算法,詳細(xì)內(nèi)容可以參考http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
運行該程序的設(shè)備信息如下
Locale = en-GB
Screen orientation = port
Screen pixel density = hdpi
Touchscreen type = notouch
Primary text input method = 12key
根據(jù)圖2的算法,一共分5步,
1.首先排除與設(shè)備信息矛盾不符的目錄,即:
drawable/
drawable-en/drawable-fr-rCA/drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
2.按照這18個規(guī)則的優(yōu)先級,從MCC and MNC開始進行2~4步驟的篩選第一步篩選剩下的目錄
3. 看在第二步中選擇的規(guī)則有沒有匹配到文件夾,如果有,就執(zhí)行第四步;如果沒有就返回執(zhí)行第二步,即切換到下一個優(yōu)先級的規(guī)。。在這個例子中,MCC and MNC沒有匹配到任何文件夾,所以返回第二步,切換到第二個規(guī)則Language and region進行篩選
4.去除那些不含有第二步規(guī)則的資源目錄,即:drawable/drawable-en/
drawable-en-port/
drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/5.繼續(xù)執(zhí)行2~4,直到找到一個最匹配的資源目錄為止,即剩下最后一個目錄。這個例子中,匹配screen orienation時,由于設(shè)備的screen orienation為port,因此,所有不包含有port資源目錄將被去除,即:drawable-en/drawable-en-port/drawable-en-notouch-12key/所以最終會選擇drawable-en-port/這個資源目錄。