Android developer 阅读笔记--应用资源概览
編輯文章中的疑問
1 R類的原理
在android開發的過程中,應當保持良好的習慣,最好就是把與資源文件相關的東西外部化。例如,給TextView設置一個字符串的時候,不是采用直接把指定字符串傳入setText()方法的參數中。而是引用String資源文件中的標簽。這樣假設用戶切換了國家語言,這個標簽也會根據規則自動的引用相應國家的string 文件,從而完成顯示方面的語言切換。這樣就可以很好的國際化。下面我們將一一講解,資源文件相關東西。 是用來做什么的,下面有什么分類,系統是按照何種規則來選擇相應的資源文件的。
用來做什么的
資源文件的主要作用就是解決多環境下的顯示適配問題。在運行時,Android 會根據當前配置使用適當的資源。例如平板與手機屏幕不同,顯示的界面可能也會不同,這時候我們需要寫出分別適應平板和手機的界面,放入指定的文件夾下面。運行時,平板就會出平板的界面,手機就會出手機的界面。當然,運行時怎么選擇相應文件是有一定規則的。這個稍后討論。
代碼上是怎么使用的
這個很簡單,想必大家應該都用過。就是通過R類中生成的資源id來訪問相應的資源, 例如TextView 中 setText(int id) 我們通常是這樣使用的: setText(R.string.xxxxxxx);
文件結構
上面這張圖片應該都很熟悉吧。我們的資源文件,就是被存儲在res文件夾下面的。下面首先有四個子文件夾,并且這四個文件夾的名字 一定不要更改! 下面是這幾個文件夾的用途:
drawable:存放圖像資源文件
layout:用來存放布局資源
mipmap:用來存放啟動圖標
values:用來存放字符串資源
以上四個文件夾的名字不能更改,并且這四個文件夾只是andriod studio 默認幫我們建立好的。事實上,res 文件夾,可支持的子文件夾名稱可不止是這些!也就是res可支持的資源類型其實有很多,下面看看它還可以支持啥子文件夾,以及各個名稱的子文件夾的作用。每個文件夾所涉及的相關知識將在后期專門寫文章,并給出相應鏈接。
animator/:用來定義屬性動畫的XML文件。
anim/:用來定義漸變動畫的XML文件。(屬性動畫也可以保存在此目錄中,但是為了區分這兩種類型,屬性動畫首選 animator/ 目錄。)
color/:用來定義顏色狀態列表的XML文件
drawable/:位圖文件(.png、.9.png、.jpg、.gif)或編譯為以下可繪制對象資源子類型的 XML 文件:
位圖文件
九宮格(可調整大小的位圖)
狀態列表
形狀
動畫可繪制對象
其他可繪制對象
**mipmap/**適用于不同啟動器圖標密度的可繪制對象文件。如需了解有關使用 mipmap/ 文件夾管理啟動器圖標的詳細信息
**layout/**用于定義用戶界面布局的XML文件。最常用!
**menu/**用于定義應用菜單(如選項菜單,上下文菜單或子菜單的XML文件)這個的用法不是很了解。
**raw/**以原始的形式保存文件。同時如果打開文件需要使用資源 ID(即 R.raw.filename)調用 Resources.openRawResource()。但是,如需訪問原始文件名和文件層次結構,則可以考慮將某些資源保存在 assets/ 目錄下(而不是 res/raw/)。assets/ 中的文件沒有資源 ID,因此只能使用 AssetManager 讀取這些文件。
**values/**這個文件夾的應用是非常普遍的!通常用于對語言字符串,顏色,建立新的屬性等。
主要的有:
arrays.xml,用于資源數組(類型化數組)。
colors.xml:顏色值。
dimens.xml:尺寸值。
strings.xml:字符串值。
styles.xml:樣式。
**xml/**這個文件夾說實話我根本沒有用過。可在運行時調用 Resources.getXML() 讀取任意的xml文件。各種xml配置文件如可搜索配置)都必須保存在此處。
以上的文件夾里存儲的都是默認資源。也就是其他類型資源沒有的情況下,就用它。但是其他情況是什么情況呢?
Android機型有千百種,有手機,平板,手表。難道走同樣的代碼,我展示的都要一模一樣么?如果一模一樣顯然是不行的。讓一個手表顯示手機上的界面,那得丑到什么程度。。所以,采用Android系統的不同類型的設備設備之間,可能會需要符合自身特點的資源文件。比如屏幕尺寸大于標準尺寸的時候,可能加載的是另外一種樣子的布局。
想要實現這樣的效果,除了默認資源以外,我們還需要提供備用資源。
提供備用資源
在開發應用中,每個應用都應當提供一些備用資源用于支持一些特殊的資源配置。比如針對不同屏幕密度的設備,和不同國家的文案語言。
如何指定備用資源?
1 在res/大文件夾下,創建一個以 <resorces_name>-<config_qualifier>[-<config_qualifier>] (資源名稱-配置限定詞后面可以跟隨若干個配置限定詞)
上一小節里面介紹的子文件夾,提到過名稱不要更改,,此處的就是上面的文件夾名稱。任意一個都可以。關鍵是你要做什么用,從而選擇不同的名。
<config_qualifier> 是指定要使用這些資源的各個配置的名稱,如圖所示:
其中 drawable就是默認情況下的引用文件位置。drawable-xhdpi表示資源適用于屏幕密度較高的設備,當屏幕密度較高的時候,會自動引用drawable-xhdpi的文件。這樣一來,用于引用 icon.png 或 background.png 圖像的資源 ID 始終相同,但是 Android 會通過將設備配置信息與資源目錄名稱中的限定符進行比較,選擇最符合當前設備的各個資源版本。
那么這種規則是什么呢?如我把手機語言變成English,文案就變成英文的文案。我該如何給文件夾起名字,總不能瞎起吧。
資源文件,子文件夾名字命名規則
接下來這套命名規則是重中之重!
配置 限定符值 說明,這套匹配規則的優先級是按照下面段落的前后來的,前面的段落匹配優先級高于后面的段落!
MCC 和 MNC 示例:
mcc310
mcc310-mnc004
mcc208-mnc00
等等
移動國家代碼 (MCC),(可選)后跟設備 SIM 卡中的移動網絡代碼 (MNC)。例如,mcc310 是指美國的任一運營商,mcc310-mnc004 是指美國的 Verizon 公司,mcc208-mnc00 是指法國的 Orange 公司。
如果設備使用無線電連接(GSM 手機),則 MCC 和 MNC 值來自 SIM 卡。
也可以單獨使用 MCC(例如,將國家/地區特定的合法資源包括在應用中)。如果只需根據語言指定,則改用“語言和區域”限定符(稍后進行介紹)。 如果決定使用 MCC 和 MNC 限定符,請謹慎執行此操作并測試限定符是否按預期工作。
另請參閱配置字段 mcc 和 mnc,這兩個字段分別表示當前的移動國家代碼和移動網絡代碼。
語言和區域 示例:
en
fr
en-rUS
fr-rFR
fr-rCA
等等
語言通過由兩個字母組成的 ISO 639-1 語言代碼定義,可以選擇后跟兩個字母組成的 ISO 3166-1-alpha-2 區域碼(前帶小寫字母“r”)。
這些代碼不區分大小寫;r 前綴用于區分區域碼。 不能單獨指定區域。
如果用戶更改系統設置中的語言,它有可能在應用生命周期中發生改變。 可能會給應用帶來影響。
有關針對其他語言本地化應用的完整指南,請參閱本地化。
另請參閱 locale 配置字段,該字段表示當前的語言區域。
布局方向 ldrtl
ldltr
應用的布局方向。ldrtl 是指“布局方向從右到左”。ldltr 是指“布局方向從左到右”,這是默認的隱式值。
它適用于布局、圖片或值等任何資源。
例如,若要針對阿拉伯語提供某種特定布局,并針對任何其他“從右到左”語言(如波斯語或希伯來語)提供某種通用布局,則可編碼如下:
res/
layout/
main.xml (Default layout)
layout-ar/
main.xml (Specific layout for Arabic)
layout-ldrtl/
main.xml (Any “right-to-left” language, except
for Arabic, because the “ar” language qualifier
has a higher precedence.)
注:要為應用啟用從右到左的布局功能,必須將 supportsRtl 設置為 “true”,并將 targetSdkVersion 設置為 17 或更高版本。
此項為 API 級別 17 中新增配置。
smallestWidth swdp
示例:
sw320dp
sw600dp
sw720dp
等等
屏幕的基本尺寸,由可用屏幕區域的最小尺寸指定。 具體來說,設備的 smallestWidth 是屏幕可用高度和寬度的最小尺寸(您也可以將其視為屏幕的“最小可能寬度”)。無論屏幕的當前方向如何,您均可使用此限定符確保應用 UI 的可用寬度至少為 dp。
例如,如果布局要求屏幕區域的最小尺寸始終至少為 600dp,則可使用此限定符創建布局資源 res/layout-sw600dp/。僅當可用屏幕的最小尺寸至少為 600dp 時,系統才會使用這些資源,而不考慮 600dp 所代表的邊是用戶所認為的高度還是寬度。smallestWidth 是設備的固定屏幕尺寸特性;設備的 smallestWidth 不會隨屏幕方向的變化而改變。
設備的 smallestWidth 將屏幕裝飾元素和系統 UI 考慮在內。例如,如果設備的屏幕上有一些永久性 UI 元素占據沿 smallestWidth 軸的空間,則系統會聲明 smallestWidth 小于實際屏幕尺寸,因為這些屏幕像素不適用于您的 UI。 因此,使用的值應該是布局所需要的實際最小尺寸(通常,無論屏幕的當前方向如何,此值都是布局支持的“最小寬度”)。
以下是一些可用于普通屏幕尺寸的值:
320,適用于屏幕配置如下的設備:
240x320 ldpi(QVGA 手機)
320x480 mdpi(手機)
480x800 hdpi(高密度手機)
480,適用于 480x800 mdpi 之類的屏幕(平板電腦/手機)。
600,適用于 600x1024 mdpi 之類的屏幕(7 英寸平板電腦)。
720,適用于 720x1280 mdpi 之類的屏幕(10 英寸平板電腦)。
應用為多個資源目錄提供不同的 smallestWidth 限定符值時,系統會使用最接近(但未超出)設備 smallestWidth 的值。
此項為 API 級別 13 中新增配置。
另請參閱 android:requiresSmallestWidthDp 屬性和 smallestScreenWidthDp 配置字段,前者聲明與應用兼容的最小 smallestWidth;后者存放設備的 smallestWidth 值。
如需了解有關設計不同屏幕和使用此限定符的詳細信息,請參閱支持多種屏幕開發者指南。
可用寬度 wdp
示例:
w720dp
w1024dp
等等
指定資源應該使用的最小可用屏幕寬度,以 dp 為單位,由 值定義。在橫向和縱向之間切換時,為了匹配當前實際寬度,此配置值也會隨之發生變化。
應用為多個資源目錄提供不同的此配置值時,系統會使用最接近(但未超出)設備當前屏幕寬度的值。 此處的值考慮到了屏幕裝飾元素,因此如果設備顯示屏的左邊緣或右邊緣上有一些永久性 UI 元素,考慮到這些 UI 元素,它會使用小于實際屏幕尺寸的寬度值,這樣會減少應用的可用空間。
此項為 API 級別 13 中新增配置。
另請參閱 screenWidthDp 配置字段,該字段存放當前屏幕寬度。
如需了解有關設計不同屏幕和使用此限定符的詳細信息,請參閱支持多種屏幕開發者指南。
可用高度 hdp
示例:
h720dp
h1024dp
等等
指定資源應該使用的最小可用屏幕高度,以“dp”為單位,由 值定義。 在橫向和縱向之間切換時,為了匹配當前實際高度,此配置值也會隨之發生變化。
應用為多個資源目錄提供不同的此配置值時,系統會使用最接近(但未超出)設備當前屏幕高度的值。 此處的值考慮到了屏幕裝飾元素,因此如果設備顯示屏的上邊緣或下邊緣有一些永久性 UI 元素,考慮到這些 UI 元素,同時為減少應用的可用空間,它會使用小于實際屏幕尺寸的高度值。 非固定的屏幕裝飾元素(例如,全屏時可隱藏的手機狀態欄)并不在考慮范圍內,標題欄或操作欄等窗口裝飾也不在考慮范圍內,因此應用必須準備好處理稍小于其所指定值的空間。
此項為 API 級別 13 中新增配置。
另請參閱 screenHeightDp 配置字段,該字段存放當前屏幕寬度。
如需了解有關設計不同屏幕和使用此限定符的詳細信息,請參閱支持多種屏幕開發者指南。
屏幕尺寸 small
normal
large
xlarge
small:尺寸類似于低密度 QVGA 屏幕的屏幕。小屏幕的最小布局尺寸約為 320x426 dp 單位。例如,QVGA 低密度屏幕和 VGA 高密度屏幕。
normal:尺寸類似于中等密度 HVGA 屏幕的屏幕。標準屏幕的最小布局尺寸約為 320x470 dp 單位。例如,WQVGA 低密度屏幕、HVGA 中等密度屏幕、WVGA 高密度屏幕。
large:尺寸類似于中等密度 VGA 屏幕的屏幕。 大屏幕的最小布局尺寸約為 480x640 dp 單位。 例如,VGA 和 WVGA 中等密度屏幕。
xlarge:明顯大于傳統中等密度 HVGA 屏幕的屏幕。超大屏幕的最小布局尺寸約為 720x960 dp 單位。在大多數情況下,屏幕超大的設備體積過大,不能放進口袋,最常見的是平板式設備。 API 級別 9 中的新增配置。
注:使用尺寸限定符并不表示資源僅適用于該尺寸的屏幕。 如果沒有為備用資源提供最符合當前設備配置的限定符,則系統可能使用其中最匹配的資源。
注意:如果所有資源均使用大于當前屏幕的尺寸限定符,則系統不會使用這些資源,并且應用在運行時將會崩潰(例如,如果所有布局資源均用 xlarge 限定符標記,但設備是標準尺寸的屏幕)。
此項為 API 級別 4 中新增配置。
如需了解詳細信息,請參閱支持多種屏幕。
另請參閱 screenLayout 配置字段,該字段表示屏幕是小尺寸、標準尺寸還是大尺寸。
屏幕縱橫比 long
notlong
long:寬屏,如 WQVGA、WVGA、FWVGA
notlong:非寬屏,如 QVGA、HVGA 和 VGA
此項為 API 級別 4 中新增配置。
它完全基于屏幕的縱橫比(寬屏較寬),而與屏幕方向無關。
另請參閱 screenLayout 配置字段,該字段指示屏幕是否為寬屏。
圓形屏幕 round
notround
round:圓形屏幕,例如圓形可穿戴式設備
notround:方形屏幕,例如手機或平板電腦
此項為 API 級別 23 中新增配置。
另請參閱 isScreenRound() 配置方法,其指示屏幕是否為寬屏。
屏幕方向 port
land
port:設備處于縱向(垂直)
land:設備處于橫向(水平)
如果用戶旋轉屏幕,它有可能在應用生命周期中發生改變。 如需了解這會在運行期間給應用帶來哪些影響,請參閱處理運行時變更。
另請參閱 orientation 配置字段,該字段指示當前的設備方向。
UI 模式 car
desk
television
appliance watch
car:設備正在車載手機座上顯示
desk:設備正在桌面手機座上顯示
television:設備正在電視上顯示,為用戶提供“十英尺”體驗,其 UI 位于遠離用戶的大屏幕上,主要面向方向鍵或其他非指針式交互
appliance:設備用作不帶顯示屏的裝置
watch:設備配有顯示屏,戴在手腕上
此項為 API 級別 8 中新增配置,API 13 中新增電視配置,API 20 中新增手表配置。
如需了解應用在設備插入手機座或從中移除時的響應方式,請閱讀確定并監控插接狀態和類型。
如果用戶將設備放入手機座中,它有可能在應用生命周期中發生改變。 可以使用 UiModeManager 啟用或禁用其中某些模式。如需了解這會在運行期間給應用帶來哪些影響,請參閱處理運行時變更。
夜間模式 night
notnight
night:夜間
notnight:白天
此項為 API 級別 8 中新增配置。
如果夜間模式停留在自動模式(默認),它有可能在應用生命周期中發生改變。在這種情況下,該模式會根據當天的時間進行調整。 可以使用 UiModeManager 啟用或禁用此模式。如需了解這會在運行期間給應用帶來哪些影響,請參閱處理運行時變更。
屏幕像素密度 (dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
ldpi:低密度屏幕;約為 120dpi。
mdpi:中等密度(傳統 HVGA)屏幕;約為 160dpi。
hdpi:高密度屏幕;約為 240dpi。
xhdpi:超高密度屏幕;約為 320dpi。此項為 API 級別 8 中新增配置
xxhdpi:超超高密度屏幕;約為 480dpi。此項為 API 級別 16 中新增配置
xxxhdpi:超超超高密度屏幕使用(僅限啟動器圖標,請參閱“支持多種屏幕”中的注釋);約為 640dpi。 此項為 API 級別 18 中新增配置
nodpi:它可用于您不希望縮放以匹配設備密度的位圖資源。
tvdpi:密度介于 mdpi 和 hdpi 之間的屏幕;約為 213dpi。它并不是“主要”密度組, 主要用于電視,而大多數應用都不需要它。對于大多數應用而言,提供 mdpi 和 hdpi 資源便已足夠,系統將根據需要對其進行縮放。此項為 API 級別 13 中新增配置
anydpi:此限定符適合所有屏幕密度,其優先級高于其他限定符。 這對于矢量可繪制對象很有用。 此項為 API 級別 21 中新增配置
六個主要密度之間的縮放比為 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9x9 (ldpi) 位圖相當于 12x12 (mdpi)、18x18 (hdpi)、24x24 (xhdpi) 位圖,依此類推。
如果您認為圖像資源在電視或其他某些設備上呈現的效果不夠好,而想嘗試使用 tvdpi 資源,則縮放比例為 1.33*mdpi。例如,mdpi 屏幕的 100px x 100px 圖像應該相當于 tvdpi 的133px x 133px。
注:使用密度限定符并不表示資源僅適用于該密度的屏幕。 如果沒有為備用資源提供最符合當前設備配置的限定符,則系統可能使用其中最匹配的資源。
如需了解有關如何處理不同屏幕密度以及 Android 如何縮放位圖以適應當前密度的詳細信息,請參閱支持多種屏幕。
觸摸屏類型 notouch
finger
notouch:設備沒有觸摸屏。
finger:設備有一個專供用戶通過手指直接與其交互的觸摸屏。
另請參閱 touchscreen 配置字段,該字段指示設備上的觸摸屏類型。
鍵盤可用性 keysexposed
keyshidden
keyssoft
keysexposed:設備具有可用的鍵盤。如果設備啟用了軟鍵盤(不無可能),那么即使硬鍵盤沒有展示給用戶,哪怕設備沒有硬鍵盤,也可以使用此限定符。 如果沒有提供或已經禁用軟鍵盤,則只有在顯示硬鍵盤時才會使用此限定符。
keyshidden:設備具有可用的硬鍵盤,但它處于隱藏狀態,且設備沒有啟用軟鍵盤。
keyssoft:設備已經啟用軟鍵盤(無論是否可見)。
如果提供了 keysexposed 資源,但未提供 keyssoft 資源,那么只要系統已經啟用軟鍵盤,就會使用 keysexposed 資源,而不考慮鍵盤是否可見。
如果用戶打開硬鍵盤,它有可能在應用生命周期中發生改變。 如需了解這會在運行期間給應用帶來哪些影響,請參閱處理運行時變更。
另請參閱配置字段 hardKeyboardHidden 和 keyboardHidden,這兩個字段分別指示硬鍵盤的可見性和任何一種鍵盤(包括軟鍵盤)的可見性。
主要文本輸入法 nokeys
qwerty
12key
nokeys:設備沒有用于文本輸入的硬按鍵。
qwerty:設備具有標準硬鍵盤(無論是否對用戶可見)。
12key:設備具有 12 鍵硬鍵盤(無論是否對用戶可見)。
另請參閱 keyboard 配置字段,該字段指示可用的主要文本輸入法。
導航鍵可用性 navexposed
navhidden
navexposed:導航鍵可供用戶使用。
navhidden:導航鍵不可用(例如,位于密封蓋子后面)。
如果用戶顯示導航鍵,它有可能在應用生命周期中發生改變。 如需了解這會在運行期間給應用帶來哪些影響,請參閱處理運行時變更。
另請參閱 navigationHidden 配置字段,該字段指示導航鍵是否處于隱藏狀態。
主要非觸摸導航方法 nonav
dpad
trackball
wheel
nonav:除了使用觸摸屏以外,設備沒有其他導航設施。
dpad:設備具有用于導航的方向鍵。
trackball:設備具有用于導航的軌跡球。
wheel:設備具有用于導航的方向盤(不常見)。
另請參閱 navigation 配置字段,該字段指示可用的導航方法類型。
平臺版本(API 級別) 示例:
v3
v4
v7
等等
設備支持的 API 級別。例如,v1 對應于 API 級別 1(帶有 Android 1.0 或更高版本系統的設備),v4 對應于 API 級別 4(帶有 Android 1.6 或更高版本系統的設備)。如需了解有關這些值的詳細信息,請參閱 Android API 級別文檔。
限定符的命名規則
文件名的格式為 drawable-port-hdpi 短橫線進行連接,并且連接后面的文字嚴格按照上面段落的名稱來,切嚴格遵守段落的順序來,這個循序說白了就是優先級。比如。
錯誤:drawable-hdpi-port/
正確:drawable-port-hdpi/
創建別名資源–圖片
例如一個圖片資源 a.png,是默認資源。就在drawable文件夾下。 然后,當當前國家為亞太地區國家的時候,比如日本,韓國,的時候,都要使用 b.png,在美國,英國等一些國家使用c.png, 如果找不到資源,那就直接取 a.png。
但是,根據資源本地化的規則,你可能會建立很多個文件夾,叫 drawable-xxx-xxx, 里面要把 b.png拷貝進去或者 c.png拷貝到美國等一些國家去,再對他們的名字進行修改,都改成a.png。這樣程序引用的時候,寫getDrawable(R.drawable.a), 通過代碼就能找到正確的文件了。。但是有對少個國家我們真的就有必要拷貝多少份嗎???
其實是有簡單的方法的。可以省下不少資源。我們直接把b.png, c.png放到默認路徑drawable,然后當引用本地化文件的時候,用一種方式告知,此時應當用哪個文件。要做的方式就是,在drawable-xxx-xxx這類文件下,寫一個名叫a.xml,在a.xml中進行描述,告知要取的是 b.png, 或者c.png。代碼如下:
圖片資源
layout文件
同樣的,layout文件也可以被這樣引用。使用的標簽是merge 和 include。文件取名與默認文件夾對應的名稱相同。
其余的簡單文件也可以這樣用,不過感覺也節省不了什么資源。
<?xml version="1.0" encoding="utf-8"?> <resources><string name="hello">Hello</string><string name="hi">@string/hello</string> </resources> <?xml version="1.0" encoding="utf-8"?> <resources><color name="red">#f00</color><color name="highlight">@color/red</color> </resources>總結
以上是生活随笔為你收集整理的Android developer 阅读笔记--应用资源概览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据存储与容灾实验 用Winhex恢复磁
- 下一篇: 服务器集群虚拟机,服务器集群虚拟机