Android 資源文件匹配

一直以來(lái)對(duì)于系統(tǒng)選擇資源文件的流程都模糊不清,每次定義資源的時(shí)候都戰(zhàn)戰(zhàn)兢兢,終于忍無(wú)可忍,無(wú)需再忍,決定掏出官方文檔來(lái)仔細(xì)瞧一瞧。摘要記錄,以防忘記。

官方文檔

資源類型

一個(gè)簡(jiǎn)單的項(xiàng)目目錄如下所示:

圖1 簡(jiǎn)單項(xiàng)目目錄

其中資源文件放置在res目錄下,res支持的資源目錄和類型如下:

目錄 資源類型
animator/ 定義屬性動(dòng)畫的XML文件
anim/ 定義漸變動(dòng)畫的XML文件
color/ 定義顏色狀態(tài)表的XML文件
drawable/ 位圖文件(.png、.9.png、.jpg、.gif)或者可編譯為以下類型的XML文件:位圖文件、九宮格文件、狀態(tài)列表文件(State List)、形狀(Shape)、動(dòng)畫可繪制文件(Animation drawables)等等
mipmap/ 不同密度的Launcher圖標(biāo)文件
layout/ 布局XML文件
menu/ 菜單XML文件
raw/ 原始資源文件,使用資源id進(jìn)行訪問(wèn),如需要文件名進(jìn)行訪問(wèn),可放置到assets/目錄下
values/ 字符串、整型和樣式等簡(jiǎn)單值的XML文件,該目錄文件夾下可以有子目錄,每個(gè)文件都以標(biāo)簽<resources>定義資源,本可以將所有的簡(jiǎn)單資源文件定義到一個(gè)XML文件中,但為了結(jié)構(gòu)的清晰,我們一般使用arrays.xml來(lái)定義資源數(shù)組,colors.xml來(lái)定義顏色值,dimens.xml定義尺寸值,strings.xml來(lái)定義字符串值,styles.xml來(lái)定義樣式
xml/ 運(yùn)行時(shí)可通過(guò)Resources.getXML()讀取的XML文件

資源選擇

資源命名

對(duì)于一個(gè)資源文件,針對(duì)設(shè)備的不同,需要提供一整套的資源文件供程序運(yùn)行時(shí)根據(jù)設(shè)備和運(yùn)行條件(橫屏或者豎屏、移動(dòng)還是聯(lián)通)的不同來(lái)選擇合適的資源文件。
資源文件必須名稱相同地放置到合適的資源文件夾下面,而資源文件夾的命名至關(guān)重要。資源文件夾必須嚴(yán)格按照“資源類型名稱-配置1-配置2-...”的方式進(jìn)行命名,如圖2中,drawable是資源類型,hdpi是一個(gè)分辨率的配置。在drawable-hdpi和drawble文件夾中分別放置相同名稱的高分辨率和默認(rèn)配置的2個(gè)資源文件。

圖2 資源文件夾的命名

設(shè)備在運(yùn)行時(shí)選擇資源的標(biāo)準(zhǔn)就是按照資源文件夾的命名來(lái)匹配選擇最優(yōu)的資源文件。 設(shè)備按如下表的配置順序依次匹配來(lái)選擇最佳的資源(注意:下表的配置僅為主要配置,不是全部。):

配置 限定符值 說(shuō)明
MCC MNC 示例:mcc460 中國(guó) mcc460-mnc00 中國(guó)移動(dòng) mcc移動(dòng)國(guó)家代碼,mnc 移動(dòng)網(wǎng)絡(luò)代碼,mcc460是中國(guó)任一運(yùn)營(yíng)商,mcc460-mnc00 中國(guó)移動(dòng)
語(yǔ)言和區(qū)域 示例:zh_rCN,zh_rTW,zh_rHK zh,中文語(yǔ)言縮寫,r后面跟區(qū)域碼,CN大陸,TW臺(tái)灣,HK香港,這個(gè)用戶在使用過(guò)程中是有可能改變的
布局方向 ldrtl,ldltr 布局由右向左ldrtl,由左向右ltr
smallestWidth sw<N>dp,示例sw320dp,sw600dp 屏幕高度和寬度的最小尺寸,一個(gè)sw320dp的文件夾定義的資源只有在高度和寬度都大于320dp的情況下才可能被使用。
可用寬度 w<N>dp,示例w720dp,w960dp 當(dāng)可用寬度大于指定寬度時(shí),即可能被選中,寬度在橫向和縱向切換時(shí)是可變的。例如一個(gè)1024*720dp的設(shè)備在縱向時(shí)不可能匹配w960dp,而在橫向時(shí)則有可能。在匹配時(shí)選擇接近但未超出當(dāng)前屏幕寬度的值。
可用高度 h<N>dp 跟可用寬度的匹配一樣
屏幕尺寸 small,normal,large,xlarge small指屏幕尺寸小于3英寸,normal小于4.5英寸,large是4.5英寸-7英寸之間,xlarge是7-10英寸之間 鏈接
屏幕縱橫比 long,notlong long 寬屏 如 WQVGA,,WVGA,FWVGA(帶W的),not long 非寬屏,如QVGA,HVGA,VGA
圓形屏幕 round,not round round:圓形屏幕,例如圓形可穿戴設(shè)備,not round 方形屏幕,手機(jī)和電腦
屏幕方向 port,land port 縱向,land 橫向
UI模式 car,desk,televesion,applicance,watch car 車載顯示;desk 桌面手機(jī)顯示,television 電視顯示,applicance 不帶顯示屏的,watch 手腕設(shè)備
夜間模式 night,notnight night 夜間,notnight 白天,根據(jù)時(shí)間進(jìn)行顯示,可以通過(guò)UiModeManager啟用和關(guān)閉
屏幕密度(dpi) ldpi,mdip,hdpi,xhdpi,xxhdpi,xxxhdpi,nodpi,tvdpi,anydpi ldpi:120dpi,mdpi:160dpi,hdpi:240dpi,xhdpi:320dpi,xxhdpi:480dpi,xxxhdpi:640dpi,按照3:4:6:8:12:16的比例。nodpi,不希望被縮放的位圖資源,anydpi 任意密度的屏幕。
觸摸類型 nottouch,finger nottouch:沒(méi)有觸摸屏,finger:手指交互的觸摸屏
鍵盤可用性 keysexposed,keyhidden,keyssoft keyexposed 硬鍵盤可用。keyshidden 硬鍵盤可用,但隱藏了,同時(shí)沒(méi)有啟動(dòng)軟鍵盤。keyssoft 啟用軟鍵盤。
輸入法 nokeys,qwerty,12key nokeys:設(shè)備沒(méi)有硬按鍵,qwerty設(shè)備具有標(biāo)準(zhǔn)硬鍵盤,12ke設(shè)備具有12鍵硬鍵盤
API版本 v3,v7,v11等等 設(shè)備的API級(jí)別,v1即設(shè)備API級(jí)別為1或者更高

對(duì)于資源文件夾的命名必須按照上表中的順序依次配置,切不可倒置。

  • 錯(cuò)誤:drawable-hdpi-port/
  • 正確:drawable-port-hdpi/

選擇資源

android系統(tǒng)按照如圖3所示進(jìn)行資源的匹配選擇。

圖3 資源選擇流程

例如app有以下資源文件夾:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

系統(tǒng)配置:
運(yùn)營(yíng)商 = mcc400-mnc00
語(yǔ)言區(qū)域 = en-rGB
屏幕方向 = port
屏幕密度 = hdpi
觸屏類型 = nottouch

開始選擇:

  • 取出第一個(gè)配置:mcc400-mnc00,發(fā)現(xiàn)所有的配置中都不包含此種類型的配置,不沖突不包含,跳過(guò)該配置
  • 取出第二個(gè)配置:en-rGB
    • 移除與en配置沖突的 drawable-fr-rCA
    • 移除那些不包含此配置的資源文件夾 drawable-port-ldpi/ drawable-port-notouch-12key/
  • 取出第屏幕方向布局就只剩下資源文件夾drawable-en-port/

設(shè)備兼容性

請(qǐng)確保每種配置都有一個(gè)默認(rèn)的資源可以進(jìn)行選擇,這樣在出現(xiàn)設(shè)備沒(méi)有任何匹配文件夾的情況下可以選擇默認(rèn)的文件夾中的資源而不至于導(dǎo)致系統(tǒng)崩潰。例如,如果我們只配置2種文件夾values-en,values-zh,那么在設(shè)備語(yǔ)言為法語(yǔ)(fr)的情況下,按照先移除沖突的資源文件夾的準(zhǔn)則,這2個(gè)資源文件夾都被移除了已經(jīng)沒(méi)有其他可以選擇的資源文件了,系統(tǒng)會(huì)崩潰,所有任何資源文件夾都請(qǐng)保留一個(gè)默認(rèn)名稱的資源文件夾

創(chuàng)建別名資源

有時(shí)候有些資源希望在不同的配置下可以服用,例如一個(gè)很大的背景圖片希望在語(yǔ)言為中文(zh)和英文(en)的情況下都使用,這時(shí)候如果在drawable-zh和drawable-en的文件夾下面都放置一種圖片當(dāng)然是可以的,只是這樣會(huì)造成apk的體積過(guò)大。這時(shí)候可以將此圖拷貝到drawable/文件夾下命名為icon_zh_en,而在
drawable-en和drawable-zh文件夾下分別保存下面的icon.xml文件,那么同樣載en和zh的配置下也可以通過(guò)引用R.drawable.icon引用到圖片,從而對(duì)apk瘦身。同樣對(duì)于資源文件、數(shù)組、布局文件都可以使用別名來(lái)引用以達(dá)到避免資源重復(fù)的問(wèn)題。

<!--icon.xml-->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="icon">@drawable/icon_zh_en</drawable>
</resources>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容