Android 資源文件匹配

一直以來對于系統(tǒng)選擇資源文件的流程都模糊不清,每次定義資源的時候都戰(zhàn)戰(zhàn)兢兢,終于忍無可忍癞志,無需再忍,決定掏出官方文檔來仔細瞧一瞧刚梭。摘要記錄,以防忘記票唆。

官方文檔

資源類型

一個簡單的項目目錄如下所示:

圖1 簡單項目目錄

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

目錄 資源類型
animator/ 定義屬性動畫的XML文件
anim/ 定義漸變動畫的XML文件
color/ 定義顏色狀態(tài)表的XML文件
drawable/ 位圖文件(.png屹徘、.9.png走趋、.jpg、.gif)或者可編譯為以下類型的XML文件:位圖文件噪伊、九宮格文件簿煌、狀態(tài)列表文件(State List)、形狀(Shape)鉴吹、動畫可繪制文件(Animation drawables)等等
mipmap/ 不同密度的Launcher圖標文件
layout/ 布局XML文件
menu/ 菜單XML文件
raw/ 原始資源文件姨伟,使用資源id進行訪問,如需要文件名進行訪問豆励,可放置到assets/目錄下
values/ 字符串夺荒、整型和樣式等簡單值的XML文件瞒渠,該目錄文件夾下可以有子目錄,每個文件都以標簽<resources>定義資源技扼,本可以將所有的簡單資源文件定義到一個XML文件中伍玖,但為了結(jié)構(gòu)的清晰,我們一般使用arrays.xml來定義資源數(shù)組剿吻,colors.xml來定義顏色值窍箍,dimens.xml定義尺寸值,strings.xml來定義字符串值丽旅,styles.xml來定義樣式
xml/ 運行時可通過Resources.getXML()讀取的XML文件

資源選擇

資源命名

對于一個資源文件椰棘,針對設備的不同,需要提供一整套的資源文件供程序運行時根據(jù)設備和運行條件(橫屏或者豎屏榄笙、移動還是聯(lián)通)的不同來選擇合適的資源文件邪狞。
資源文件必須名稱相同地放置到合適的資源文件夾下面,而資源文件夾的命名至關(guān)重要办斑。資源文件夾必須嚴格按照“資源類型名稱-配置1-配置2-...”的方式進行命名外恕,如圖2中,drawable是資源類型乡翅,hdpi是一個分辨率的配置鳞疲。在drawable-hdpi和drawble文件夾中分別放置相同名稱的高分辨率和默認配置的2個資源文件。

圖2 資源文件夾的命名

設備在運行時選擇資源的標準就是按照資源文件夾的命名來匹配選擇最優(yōu)的資源文件蠕蚜。 設備按如下表的配置順序依次匹配來選擇最佳的資源(注意:下表的配置僅為主要配置尚洽,不是全部。):

配置 限定符值 說明
MCC MNC 示例:mcc460 中國 mcc460-mnc00 中國移動 mcc移動國家代碼靶累,mnc 移動網(wǎng)絡代碼,mcc460是中國任一運營商腺毫,mcc460-mnc00 中國移動
語言和區(qū)域 示例:zh_rCN,zh_rTW挣柬,zh_rHK zh,中文語言縮寫潮酒,r后面跟區(qū)域碼,CN大陸邪蛔,TW臺灣急黎,HK香港,這個用戶在使用過程中是有可能改變的
布局方向 ldrtl,ldltr 布局由右向左ldrtl,由左向右ltr
smallestWidth sw<N>dp,示例sw320dp,sw600dp 屏幕高度和寬度的最小尺寸,一個sw320dp的文件夾定義的資源只有在高度和寬度都大于320dp的情況下才可能被使用侧到。
可用寬度 w<N>dp,示例w720dp,w960dp 當可用寬度大于指定寬度時勃教,即可能被選中,寬度在橫向和縱向切換時是可變的匠抗。例如一個1024*720dp的設備在縱向時不可能匹配w960dp故源,而在橫向時則有可能。在匹配時選擇接近但未超出當前屏幕寬度的值汞贸。
可用高度 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:圓形屏幕耳贬,例如圓形可穿戴設備,not round 方形屏幕猎唁,手機和電腦
屏幕方向 port,land port 縱向咒劲,land 橫向
UI模式 car,desk,televesion,applicance,watch car 車載顯示;desk 桌面手機顯示,television 電視顯示诫隅,applicance 不帶顯示屏的腐魂,watch 手腕設備
夜間模式 night,notnight night 夜間,notnight 白天逐纬,根據(jù)時間進行顯示蛔屹,可以通過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:沒有觸摸屏甸箱,finger:手指交互的觸摸屏
鍵盤可用性 keysexposed,keyhidden,keyssoft keyexposed 硬鍵盤可用育叁。keyshidden 硬鍵盤可用,但隱藏了芍殖,同時沒有啟動軟鍵盤豪嗽。keyssoft 啟用軟鍵盤。
輸入法 nokeys,qwerty,12key nokeys:設備沒有硬按鍵豌骏,qwerty設備具有標準硬鍵盤龟梦,12ke設備具有12鍵硬鍵盤
API版本 v3,v7,v11等等 設備的API級別,v1即設備API級別為1或者更高

對于資源文件夾的命名必須按照上表中的順序依次配置窃躲,切不可倒置计贰。

  • 錯誤:drawable-hdpi-port/
  • 正確:drawable-port-hdpi/

選擇資源

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

圖3 資源選擇流程

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

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

開始選擇:

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

設備兼容性

請確保每種配置都有一個默認的資源可以進行選擇,這樣在出現(xiàn)設備沒有任何匹配文件夾的情況下可以選擇默認的文件夾中的資源而不至于導致系統(tǒng)崩潰刘绣。例如,如果我們只配置2種文件夾values-en,values-zh,那么在設備語言為法語(fr)的情況下挣输,按照先移除沖突的資源文件夾的準則纬凤,這2個資源文件夾都被移除了已經(jīng)沒有其他可以選擇的資源文件了,系統(tǒng)會崩潰撩嚼,所有任何資源文件夾都請保留一個默認名稱的資源文件夾停士。

創(chuàng)建別名資源

有時候有些資源希望在不同的配置下可以服用挖帘,例如一個很大的背景圖片希望在語言為中文(zh)和英文(en)的情況下都使用,這時候如果在drawable-zh和drawable-en的文件夾下面都放置一種圖片當然是可以的恋技,只是這樣會造成apk的體積過大拇舀。這時候可以將此圖拷貝到drawable/文件夾下命名為icon_zh_en,而在
drawable-en和drawable-zh文件夾下分別保存下面的icon.xml文件,那么同樣載en和zh的配置下也可以通過引用R.drawable.icon引用到圖片蜻底,從而對apk瘦身骄崩。同樣對于資源文件、數(shù)組薄辅、布局文件都可以使用別名來引用以達到避免資源重復的問題要拂。

<!--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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市站楚,隨后出現(xiàn)的幾起案子脱惰,更是在濱河造成了極大的恐慌,老刑警劉巖窿春,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉一,死亡現(xiàn)場離奇詭異,居然都是意外死亡旧乞,警方通過查閱死者的電腦和手機蔚润,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來良蛮,“玉大人抽碌,你說我怎么就攤上這事【鐾” “怎么了货徙?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長皮胡。 經(jīng)常有香客問我痴颊,道長,這世上最難降的妖魔是什么屡贺? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任蠢棱,我火速辦了婚禮,結(jié)果婚禮上甩栈,老公的妹妹穿的比我還像新娘泻仙。我一直安慰自己,他們只是感情好量没,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布玉转。 她就那樣靜靜地躺著,像睡著了一般殴蹄。 火紅的嫁衣襯著肌膚如雪究抓。 梳的紋絲不亂的頭發(fā)上猾担,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音刺下,去河邊找鬼绑嘹。 笑死,一個胖子當著我的面吹牛橘茉,可吹牛的內(nèi)容都是我干的工腋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捺癞,長吁一口氣:“原來是場噩夢啊……” “哼夷蚊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起髓介,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惕鼓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唐础,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箱歧,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年一膨,在試婚紗的時候發(fā)現(xiàn)自己被綠了呀邢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡豹绪,死狀恐怖价淌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞒津,我是刑警寧澤蝉衣,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站巷蚪,受9級特大地震影響病毡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屁柏,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一啦膜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淌喻,春花似錦僧家、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春乘粒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伤塌。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工灯萍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人每聪。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓旦棉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親药薯。 傳聞我的和親對象是個殘疾皇子绑洛,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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