Android Resources

Resources

概覽

Overview

提供資源

Providing 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)尺寸的屏幕)。

訪問資源

Accessing Resources

感悟

資源類型

資源有兩種類型, 一種是文件型, 比如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é)流。

R類.png

引用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ù)組

Android Resource介紹和使用

Java中強(qiáng)大的format

Java魔法堂:String.format詳解

最后編輯于
?著作權(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ù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,948評(píng)論 18 139
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,622評(píng)論 0 4
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,958評(píng)論 6 342
  • 你說(shuō)我會(huì)怎樣呢?只是突然就想起你,想著戀愛的感覺,才十八歲卻活出了三十歲的樣子…… 你說(shuō)你還好嗎?我在落日...
    南陽(yáng)l閱讀 167評(píng)論 0 1
  • 1.現(xiàn)在幾乎所有的父母只要有條件就都會(huì)為孩子選擇好的學(xué)校,目的是為了給孩子提供好的環(huán)境。可是,再好的學(xué)校里,每個(gè)孩...
    annie11888閱讀 231評(píng)論 0 2