Android Resource介紹和使用
1. 相關資料夾介紹
在Android專案資料夾裡面,主要的資原始檔是放在res資料夾裡面的。assets資料夾是存放不進行編譯加工的原生檔案,即該資料夾裡面的檔案不會像xml,java檔案被預編譯,可以存放一些圖片,html,js, css等檔案。在後面會介紹如何讀取assets資料夾的資源! res資料夾裡面的多個資料夾的各自介紹(來自網上的Android開發指南中文版內容):
目錄Directory |
資源型別Resource Types |
res/drawable/ |
.png、.9.png、.jpg檔案,它們被編譯進以下的Drawable資源子型別中: 要獲得這種型別的一個資源,可以使用 為了獲取資源型別,使用mContext.getResources().getDrawable(R.drawable.imageId) 注意:放在這裡的影象資源可能會被aapt工具自動地進行無失真壓縮優化。比如,一個真彩色但並不需要256色的PNG可能會被轉換為一個帶調色盤的8位PNG。這使得同等質量的圖片佔用更少的資源。所以我們得意識到這些放在該目錄下的二進位制影象在生成時可能會發生變化。如果你想讀取一個影象位流並轉換成一個位圖(bitmap),請把影象檔案放在res/raw/目錄下,這樣可以避免被自動優化。 |
res/layout/ |
被編譯為屏幕布局(或螢幕的一部分)的XML檔案。參見佈局宣告(Declaring Layout) |
res/values/ |
可以被編譯成很多種型別的資源的XML檔案。 注意:不像其他的res/資料夾,它可以儲存任意數量的檔案,這些檔案儲存了要建立資源的描述,而不是資源本身。XML元素型別控制這些資源應該放在R類的什麼地方。 儘管這個資料夾裡的檔案可以任意命名,不過下面使一些比較典型的檔案(檔案命名的慣例是將元素型別包含在該名稱之中): array.xml 定義陣列 colors.xml 定義和。使用Resource.getDrawable()和Resources.getColor() dimens.xml定義。使用Resources.getDimension()獲得這些資源。 strings.xml定義值。使用Resources.getString()或者Resources.getText()獲取這些資源。getText()會保留在UI字串上應用的豐富的文字樣式。 styles.xml 定義物件。 |
res/xml/ |
|
res/raw/ |
直接複製到裝置中的任意檔案。它們無需編譯,新增到你的應用程式編譯產生的壓縮檔案中。要使用這些資源,可以呼叫,引數是資源的ID,即R.raw.somefilename。 |
2.自動生成的R class
在專案資料夾的gen資料夾裡面有個R.java,我們平常引用的資源主要引用這個類的變數。 注意:R類是自動生成的,並且它不能被手動修改。當資源發生變動時,它會自動修改。3. 在程式碼中使用資源
下面是一個引用資源的語法: R.resource_type.resource_name 或者 android.R.resource_type.resource_name 其中resource_type是R的子類,儲存資源的一個特定型別。resource_name是在XML檔案定義的資源的name屬性,或者有其他檔案型別為資源定義的檔名(不包含副檔名,這指的是drawable資料夾裡面的icon.png類似的檔案,name=icon)。 Android包含了很多標準資源,如螢幕樣式和按鈕背景。要在程式碼中引用這些資源,你必須使用android進行限定,如android.R.drawable.button_background。 下面是官方給出的一些在程式碼中使用已編譯資源的正確和錯誤用法的例子:- // Load a background for the current screen from a drawable resource.
- this.getWindow().setBackgroundDrawableResource(R.drawable.my_background_image);
- // WRONG Sending a string resource reference into a
- // method that expects a string.
- this.getWindow().setTitle(R.string.main_title);
- // RIGHT Need to get the title from the Resources wrapper.
- this.getWindow().setTitle(Resources.getText(R.string.main_title));
- // Load a custom layout for the current screen.
- setContentView(R.layout.main_screen);
- // Set a slide in animation for a ViewFlipper object.
- mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
- R.anim.hyperspace_in));
- // Set the text on a TextView object.
- TextView msgTextView = (TextView)findViewByID(R.id.msg);
- msgTextView.setText(R.string.hello_message);
- //在螢幕上顯示標準應用程式的圖示
- publicclass MyActivity extends Activity {
- publicvoid onStart() {
- requestScreenFeatures(FEATURE_BADGE_IMAGE);
- super.onStart();
- setBadgeResource(android.R.drawable.sym_def_app_icon);
- }
- }
- //應用系統定義的標準"綠色背景"視覺處理
- publicclass MyActivity extends Activity
- publicvoid onStart() {
- super.onStart();
- setTheme(android.R.style.Theme_Black);
- }
- }
4. xml檔案內引用資源
1) 引用自定義的資源 android:text="@string/hello" 這裡使用"@"字首引入對一個資源的引用--在@[package:]type/name形式中後面的文字是資源的名稱。在這種情況下,我們不需要指定包名,因為我們引用的是我們自己包中的資源。type是xml子節點名,name是xml屬性名:- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="hello">Hello World, HelloDemo!</string>
- </resources>
5. 替換資源(為了可替換的資源和配置)
6. Color Value
語法:- <colorname="color_name">#color_value</color>
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <colorname="opaque_red">#f00</color>
- <colorname="translucent_red">#80ff0000</color>
- </resources>
7.Color Drawables
語法:- <drawablename="color_name">color_value</drawable>
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <drawablename="opaque_red">#f00</drawable>
- <drawablename="translucent_red">#80ff0000</drawable>
- </resources>
8. 圖片
一般放在res/drawable/裡面。官方提示png (preferred), jpg (acceptable), gif (discouraged),看來一般使用png格式比較好! xml引用 @[package:]drawable/some_file java引用 R.drawable.some_file 引用是不帶副檔名9. dimension
語法:- <dimenname="dimen_name">dimen_value單位</dimen>
Java: float dimen = Resources.getDimen(R.dimen.some_name) xml示例:
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <dimenname="one_pixel">1px</dimen>
- <dimenname="double_density">2dp</dimen>
- <dimenname="sixteen_sp">16sp</dimen>
- </resources>
10. string
下面是官方給出的正確/錯誤的例子:- //不使用轉義符則需要用雙引號包住整個string
- <stringname="good_example">"This'll work"</string>
- //使用轉義符
- <stringname="good_example_2">This/'ll also work</string>
- //錯誤
- <stringname="bad_example">This won't work!</string>
- //錯誤 不可使用html轉義字元
- <stringname="bad_example_2">XML encodings won't work either!</string>
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="simple_welcome_message">Welcome!</string>
- <stringname="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
- </resources>
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textAlign="center"
- android:text="@string/simple_welcome_message"/>
- // Assign a styled string resource to a TextView on the current screen.
- CharSequence str = getString(R.string.styled_welcome_message);
- TextView tv = (TextView)findViewByID(R.id.text);
- tv.setText(str);
- <?xmlversion="1.0"encoding="utf-8"?>
- <resources>
- <stringname="search_results_resultsTextFormat">%1$d results for <b>&quot;%2$s&quot;</b></string>
- </resources>
- //title是我們想賦值給%2$s的字串
- String escapedTitle = TextUtil.htmlEncode(title);
- String resultsTextFormat = getContext().getResources().getString(R.string.search_results_resultsTextFormat);
- String resultsText = String.format(resultsTextFormat, count, escapedTitle);
- CharSequence styledResults = Html.fromHtml(resultsText);