Resources
概覽
提供資源
感悟
外部化應(yīng)用資源,例如圖像和代碼中的字符串,這樣有利于您單獨(dú)維護(hù)這些資源。 此外,您還應(yīng)該為特定設(shè)備配置提供備用資源,方法是將它們分組到專門命名的資源目錄中。 在運(yùn)行時(shí),Android 會(huì)根據(jù)當(dāng)前配置使用適當(dāng)?shù)馁Y源。例如,您可能需要根據(jù)屏幕尺寸提供不同的 UI 布局,或者根據(jù)語(yǔ)言設(shè)置提供不同的字符串。
資源目錄結(jié)構(gòu)
在res/下的資源在項(xiàng)目R類中都有相應(yīng)的資源ID。如需訪問原始文件名和文件層次結(jié)構(gòu),則可以考慮將某些資源保存在 assets/ 目錄下(而不是 res/raw/)。assets/ 中的文件沒有資源 ID,因此您只能使用 AssetManager 讀取這些文件。
備用資源
在創(chuàng)建備用資源目錄,追加多個(gè)限定符時(shí),一定要用短劃線(-)隔開。并且一定要按照Providing Resources中表2描述的上下順序來(lái)添加。如果限定符順序錯(cuò)誤,那么該資源將被忽略。
默認(rèn)資源
要使應(yīng)用支持多種設(shè)備配置,則務(wù)必為應(yīng)用使用的每種資源類型提供默認(rèn)資源,這一點(diǎn)非常重要。如果您將所有字符串放入帶有語(yǔ)言和區(qū)域限定符的目錄中,則在語(yǔ)言設(shè)置不支持您的字符串的設(shè)備上運(yùn)行應(yīng)用時(shí),應(yīng)用將會(huì)崩潰。 但是,只要提供默認(rèn) values/ 資源,應(yīng)用就會(huì)正常運(yùn)行(即使用戶不理解該語(yǔ)言,這也總比崩潰要好)。
屏幕密度備用資源的適配原則
如果涉及的限定符是屏幕像素密度,則 Android 會(huì)選擇最接近設(shè)備屏幕密度的選項(xiàng)。通常,Android 傾向于縮小大型原始圖像,而不是放大小型原始圖像。
屏幕尺寸備用資源的適配原則
根據(jù)屏幕尺寸限定符選擇資源時(shí),如果沒有更好的匹配資源,則系統(tǒng)將使用專為小于當(dāng)前屏幕的屏幕而設(shè)計(jì)的資源(例如,如有必要,大尺寸屏幕將使用標(biāo)準(zhǔn)尺寸的屏幕資源)。 但是,如果唯一可用的資源大于當(dāng)前屏幕,則系統(tǒng)不會(huì)使用這些資源,并且如果沒有其他資源與設(shè)備配置匹配,應(yīng)用將會(huì)崩潰(例如,如果所有布局資源均用 xlarge 限定符標(biāo)記,但設(shè)備是標(biāo)準(zhǔn)尺寸的屏幕)。
訪問資源
感悟
資源類型
資源有兩種類型, 一種是文件型, 比如drawable下的圖片資源. 另一種是簡(jiǎn)單數(shù)值資源, 比如string類型。
資源id生成
編譯應(yīng)用時(shí),aapt 會(huì)生成 R 類,其中包含您的 res/ 目錄中所有資源的資源 ID。 每個(gè)資源類型都有對(duì)應(yīng)的 R 子類(例如,R.drawable 對(duì)應(yīng)于所有 Drawable 資源),而該類型的每個(gè)資源都有對(duì)應(yīng)的靜態(tài)整型數(shù)(例如,R.drawable.icon)。這個(gè)整型數(shù)就是可用來(lái)檢索資源的資源 ID。
res/raw和assets/目錄的區(qū)別:訪問原始文件名和文件層次結(jié)構(gòu),則可以考慮將某些資源保存在 assets/ 目錄下。而只是讀取原始數(shù)據(jù)時(shí),可以放在res/raw目錄下。保存在 assets/ 目錄中的文件“絕對(duì)沒有”資源 ID,因此您無(wú)法通過 R 類或在 XML 中引用它們。您可以改為采用類似普通文件系統(tǒng)的方式查詢 assets/ 目錄中的文件,并利用 AssetManager 讀取原始數(shù)據(jù)。不過,如需的只是讀取原始數(shù)據(jù)(例如視頻文件或音頻文件)的能力,則可將文件保存在 res/raw/ 目錄中,并利用 openRawResource() 讀取字節(jié)流。
引用id的組成
- 資源類型
- 資源名稱:它是不包括擴(kuò)展名(類似.png)的文件名;或是 XML android:name 屬性中的值,如果資源是簡(jiǎn)單值的話(例如字符串)。
在代碼中訪問資源
語(yǔ)法
[<package_name>.]R.<resource_type>.<resource_name>
- <package_name> 是資源所在包的名稱(如果引用的資源來(lái)自您自己的資源包,則不需要)。
- <resource_type> 是資源類型的 R 子類。
- <resource_name> 是不帶擴(kuò)展名的資源文件名,或 XML 元素中的 android:name 屬性值(如果資源是簡(jiǎn)單值)。
在 XML 中訪問資源
語(yǔ)法
@[<package_name>:]<resource_type>/<resource_name>
- <package_name> 是資源所在包的名稱(如果引用的資源來(lái)自同一包,則不需要)
- <resource_type> 是資源類型的 R 子類
- <resource_name> 是不帶擴(kuò)展名的資源文件名,或 XML 元素中的 android:name 屬性值(如果資源是簡(jiǎn)單值)。
在XMl中訪問平臺(tái)資源
要引用系統(tǒng)資源,需要加入包名稱:
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@android:color/secondary_text_dark"
android:text="@string/hello" />
在代碼中訪問平臺(tái)資源
Android 包含許多標(biāo)準(zhǔn)資源,例如樣式、風(fēng)格主題和布局。要訪問這些資源,請(qǐng)通過 android 包名稱限定您的資源引用。例如,您可以將 Android 提供的布局資源用于 ListAdapter 中的列表項(xiàng):
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
引用樣式資源
您可以通過樣式屬性資源在當(dāng)前應(yīng)用的風(fēng)格主題中引用某個(gè)屬性的值。 通過引用樣式屬性,您可以不采用為 UI 元素提供硬編碼值這種方式,而是通過為 UI 元素設(shè)置樣式,使其匹配當(dāng)前風(fēng)格主題提供的標(biāo)準(zhǔn)變型來(lái)定制這些元素的外觀。引用樣式屬性的實(shí)質(zhì)作用是,“在當(dāng)前風(fēng)格主題中使用此屬性定義的樣式”。
語(yǔ)法
?[<package_name>:][<resource_type>/]<resource_name>
由于系統(tǒng)資源工具知道此環(huán)境中肯定存在某個(gè)屬性資源,因此您無(wú)需顯式聲明類型— 您可以將 attr 類型排除在外。
注意
切勿手動(dòng)修改 R.java 文件 — 它是在編譯您的項(xiàng)目時(shí)由 aapt 工具生成的。您下次編譯時(shí)所有更改都會(huì)被替代。
Resources
Resource類 : Android資源訪問控制類, 該類提供了大量方法獲取實(shí)際資源, Resource通過 Context.getResource()方法獲得;
通過Resources.getter()獲取資源
Resources類針對(duì)不同的資源提供了通過資源id獲取資源的getter方法。我們可以獲取Resources實(shí)例后調(diào)用這些方法來(lái)獲取res/目錄下的資源。
當(dāng)我們需要訪問文件原始數(shù)據(jù)時(shí)(res/raw目錄下),我們需要調(diào)用Resources.openRawResource()方法。
簡(jiǎn)單數(shù)值資源注意點(diǎn)
分類資源文件 : 如果將所有的資源放到一個(gè)XML文件中, 會(huì)增加維護(hù)難度, 這里將不通類型的資源放到不同的XML文件下;
- arrays.xml : 存放數(shù)組資源;
- colors.xml : 存放顏色資源;
- dimens.xml : 存放尺寸值資源;
- strings.xml : 存放字符串資源;
- styles.xml : 存放樣式資源;
- integer.xml : 存放整數(shù)資源;
- bool.xml : 存放布爾值資源;
res/value目錄XML文件<resource>子標(biāo)簽解析 :
- string標(biāo)簽 : 代表一個(gè)字符串;
- integer標(biāo)簽 : 代表一個(gè)整數(shù)值標(biāo)簽;
- bool標(biāo)簽 : 代表一個(gè)boolean值;
- color標(biāo)簽 : 代表一個(gè)顏色值;
- array標(biāo)簽 : 代表數(shù)組;
- string-array標(biāo)簽 : 代表字符串?dāng)?shù)組;
- int-array標(biāo)簽 : 代表int數(shù)組;
- style標(biāo)簽 : 代表樣式;
- dimen標(biāo)簽 : 代表一個(gè)尺寸;
color
三原色 : 白光 可以分解為 紅, 綠, 藍(lán) 三種顏色的光, 紅綠藍(lán)都是最大值的時(shí)候就是白色, 三種值相等, 但不是最大值是灰色, 如果其中一種或兩種值比較大, 就會(huì)產(chǎn)生各種顏色的彩色;
顏色表示 : 顏色通過 紅(red) 綠(green) 藍(lán)(blue) 三種顏色, 以及 透明度(alpha) 來(lái)表示的;
- 顏色開頭 : 顏色值總是以 # 開頭;
- 無(wú)透明度 : 如果沒有 alpha 值, 默認(rèn)完全不透明;
顏色定義形式 :
- #RGB : 紅 綠 藍(lán) 三原色值, 每個(gè)值分16個(gè)等級(jí), 最小為0, 最大為f;
- #ARGB : 透明度 紅 綠 藍(lán) 值, 每個(gè)值分16個(gè)等級(jí), 最小為0, 最大為f;
- #RRGGBB : 紅 綠 藍(lán) 三原色值, 每個(gè)值分 256個(gè)等級(jí), 最小為0, 最大為ff;
- #AARRGGBB : 透明度 紅 綠 藍(lán) 值, 每個(gè)值分 256個(gè)等級(jí), 最小為0, 最大為ff;
數(shù)組資源
資源數(shù)組文件 : 通常將數(shù)組定義在 /res/values/arrays.xml文件中;
- 根標(biāo)簽 : <resources> ;
- 子標(biāo)簽 : <array>, <string-array>, <integer-array>;
資源數(shù)組類型 : 數(shù)組的資源的跟標(biāo)簽都是 <resources>, 不同類型的數(shù)組的子元素不同;
- 普通類型數(shù)組 : 使用<array>作為子元素標(biāo)簽;
- 字符串?dāng)?shù)組 : 使用<string-array>作為子元素標(biāo)簽;
- 整數(shù)數(shù)組 : 使用<integer-array>作為子元素標(biāo)簽;
XML文件中調(diào)用數(shù)組資源 : @ [packageName :] array/arrayName ;
Java文件中調(diào)用數(shù)組資源 : [packageName . ]R.array.arrayName ;
- 獲取實(shí)際普通數(shù)組 : TypedArray obtainTypedArray(int id), 根據(jù)普通數(shù)組資源名稱獲取實(shí)際普通數(shù)組, TypedArray類提供了getXxx(int index)方法獲取指定索引的元素;
- 獲取字符串?dāng)?shù)組 : Resources String[] getStringArray(int id), 根據(jù)字符串?dāng)?shù)組資源名稱獲取字符串?dāng)?shù)組;
- 獲取整數(shù)數(shù)組 : Resources int[] getIntArray(int id), 根據(jù)整數(shù)數(shù)組資源名稱獲取實(shí)際的整數(shù)數(shù)組;
String
注意點(diǎn)
//不使用轉(zhuǎn)義符則需要用雙引號(hào)包住整個(gè)string
<string name="good_example">"This'll work"</string>
//使用轉(zhuǎn)義符
<string name="good_example_2">This\'ll also work</string>
//錯(cuò)誤
<string name="bad_example">This won't work!</string>
格式String
- 常規(guī)類型、字符類型和數(shù)值類型的占位符格式:
%[index$][標(biāo)識(shí)][最小寬度][.精度]轉(zhuǎn)換符
- 日期和時(shí)間類型的占位符格式:
%[index$][標(biāo)識(shí)][最小寬度]轉(zhuǎn)換符
- 與參數(shù)不對(duì)應(yīng)的占位符格式:
%[標(biāo)識(shí)][最小寬度]轉(zhuǎn)換符
% ,占位符的起始字符,若要在占位符內(nèi)部使用%,則需要寫成 %% 。
[index$] ,位置索引從1開始計(jì)算,用于指定對(duì)索引相應(yīng)的實(shí)參進(jìn)行格式化并替換掉該占位符。
[標(biāo)識(shí)] ,用于增強(qiáng)格式化能力,可同時(shí)使用多個(gè) [標(biāo)識(shí)] ,但某些標(biāo)識(shí)是不能同時(shí)使用的。
[最小寬度] ,用于設(shè)置格式化后的字符串最小長(zhǎng)度,若使用 [最小寬度] 而無(wú)設(shè)置 [標(biāo)識(shí)] ,那么當(dāng)字符串長(zhǎng)度小于最小寬度時(shí),則以左邊補(bǔ)空格的方式湊夠最小寬度。
[.精度] ,對(duì)于浮點(diǎn)數(shù)類型格式化使用,設(shè)置保留小數(shù)點(diǎn)后多少位。
轉(zhuǎn)換符 ,用于指定格式化的樣式,和限制對(duì)應(yīng)入?yún)⒌臄?shù)據(jù)類型。
標(biāo)示 | 含義 |
---|---|
- | 在最小寬度內(nèi)左對(duì)齊,不可與0標(biāo)識(shí)一起使用 |
0 | 若內(nèi)容長(zhǎng)度不足最小寬度,則在左邊用0來(lái)填充 |
# | 對(duì)8進(jìn)制和16進(jìn)制,8進(jìn)制前添加一個(gè)0,16進(jìn)制前添加0x |
+ | 結(jié)果總包含一個(gè)+或-號(hào) |
空格 | 正數(shù)前加空格,負(fù)數(shù)前加-號(hào) |
, | 只用于十進(jìn)制,每3位數(shù)字間用,分隔 |
( | 若結(jié)果為負(fù)數(shù),則用括號(hào)括住,且不顯示符號(hào) |
轉(zhuǎn)換符 | 描述 |
---|---|
b | 布爾類型,只要實(shí)參為非false的布爾類型,均格式化為字符串true,否則為字符串false |
n | 平臺(tái)獨(dú)立的換行符, 也可通過System.getProperty("line.separator")獲取 |
f | 浮點(diǎn)數(shù)型(十進(jìn)制)。顯示9位有效數(shù)字,且會(huì)進(jìn)行四舍五入。如99.99 |
a | 浮點(diǎn)數(shù)型(十六進(jìn)制) |
e | 指數(shù)類型。如9.38e+5 |
g | 浮點(diǎn)數(shù)型(比%f,%a長(zhǎng)度短些,顯示6位有效數(shù)字,且會(huì)進(jìn)行四舍五入) |
s | 字符串類型 |
c | 字符類型 |
實(shí)例:
<string name="crime_report" >%1$s!
The crime was discovered on %2$s. %3$s, and %4s
< /string>
注意:不能在xml資源中引用該類string資源,只能通過代碼來(lái)引用。例如,通過Fragment.getString(int resId, Object... formatArgs)
方法來(lái)引用該資源。參數(shù)Object... formatArgs
就是用來(lái)代替占位符。
getString(R.string.crime_report, title, dataString, solvedString, suspect);
參考
【Android 應(yīng)用開發(fā)】Android資源文件 - 使用資源存儲(chǔ)字符串 顏色 尺寸 整型 布爾值 數(shù)組