上一篇文章了解了Android資源標簽屬性及優先級 后,下面我們來看資源的具體匹配規則。
下面以一個實際例子作為說明。
假設某App中的drawable資源有如下幾種選項:
- drawable/
- drawable-en/(英語)
- drawable-fr-rCA/(法語和加拿大地區)
- drawable-en-port/(豎屏)
- drawable-en-notouch-12key/(不帶觸摸屏并具備12鍵的鍵盤)
- drawable-port-ldpi/(豎屏低密度屏幕)
- drawable-port-notouch-12key/(豎屏,不帶觸摸屏,12鍵鍵盤)
假設設備當前設備配置為:
Locale=en-GB
Screen orientation=port
Screen pixel density=hdpi
Touchscreen type=notouch
Primary text input method=12key
匹配過程分為兩個階段:
第一階段:篩選掉與設備當前配置不相符的資源選項。
在淘汰過程中,對于資源選項里沒有顯示寫出來的配置,不作為評判標準;而資源選項里顯示寫出來的,符合當前配置的可以通過篩選,否則直接淘汰。
特別注意,Android 明確規定,Density標簽不在第一階段的淘汰范圍內。
經過篩選,結果如下:
drawable/
drawable-en/
drawable-fr-rCA/(淘汰)
drawable-en-port/(豎屏)
drawable-en-notouch-12key/
drawable-port-ldpi/(作為特例保留下來)
drawable-port-notouch-12key/
第二階段:選擇最優解
經過第一階段篩選后,剩余的選項都是完全符合設備當前配置要求的(除了特列外)。第二階段的主要任務就是在剩下的資源選項中按照優先級順序篩選出一個最優的選項。
第一步,先選擇MCC,MNC來考察,發現沒有選項包含這個標簽。
第二步,繼續選擇語言與地區標簽。由于當前配置是en-GB,所以沒有帶這個標簽的選項被排除。
經過篩選,結果如下:
drawable/(淘汰)
drawable-en/
drawable-fr-rCA/(淘汰)
drawable-en-port/(豎屏)
drawable-en-notouch-12key/
drawable-port-ldpi/(淘汰)
drawable-port-notouch-12key/(淘汰)
接下來的步驟中我們重復利用這一規則,直到篩選出符合條件的選項。此例中,最終只剩下如下選項:
- drawable-en-port/(最終匹配成功)
注意:應用使用的每種資源類型時候,需要提供默認資源。這里的默認資源指未標記配置限定符的資源。例如,drawable/ 中的資源是默認可繪制資源。