Android 資源(Resources)訪問
有許多東西用來構建一個優秀的 Android 應用程式。除了應用程式的編碼,你需要關注各種各樣的資源,諸如你用到的各種靜態內容,如位圖,顏色,佈局定義,用戶介面字串,動畫等等。這些資源一般放置在專案的 res/ 下獨立子目錄中。
這節教學將學習如何來組織應用程式資源,指定替代資源,並在應用程式中訪問它們。
在eclipse中組織資源
你需要將每種資源放置在專案中 res/ 目錄的特定子目錄下。例如,這是一個簡單專案的檔層級:
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ activity_main.xml info.xml values/ strings.xml
res/ 目錄在各種子目錄中包含了所有的資源。這裏有一個圖片資源,兩個佈局資源和一個字串資源檔。下表詳細的給出了在專案中 res/ 目錄裏面支持的資源。
目錄 | 資源類型 |
---|---|
anim/ | 定義動畫屬性的XML檔。它們被保存在res/anim/檔夾下,通過R.anim類訪問 |
color/ | 定義顏色狀態列表的XML檔。它們被保存在res/color/檔夾下,通過R.color類訪問 |
drawable/ | 圖片檔,如.png,.jpg,.gif或者XML檔,被編譯為位圖、狀態列表、形狀、動畫圖片。它們被保存在res/drawable/檔夾下,通過R.drawable類訪問 |
layout/ | 定義用戶介面佈局的XML檔。它們被保存在res/layout/檔夾下,通過R.layout類訪問 |
menu/ | 定義應用程式菜單的XML檔,如選項菜單,上下文菜單,子菜單等。它們被保存在res/menu/檔夾下,通過R.menu類訪問 |
raw/ | 任意的檔以它們的原始形式保存。需要根據名為R.raw.filename的資源ID,通過調用Resource.openRawResource()來打開raw檔 |
values/ | 包含簡單值(如字串,整數,顏色等)的XML檔。這裏有一些檔夾下的資源命名規範。arrays.xml代表數組資源,通過R.array類訪問;integers.xml代表整數資源,通過R.integer類訪問;bools.xml代表布爾值資源,通過R.bool類訪問;colors.xml代表顏色資源,通過R.color類訪問;dimens.xml代表維度值,通過R.dimen類訪問;strings.xml代表字串資源,通過R.string類訪問;styles.xml代表樣式資源,通過R.style類訪問 |
xml/ | 可以通過調用Resources.getXML()來在運行時讀取任意的XML檔。可以在這裏保存運行時使用的各種配置檔 |
替代資源
你的應用程式需要為特定的設備配置提供替代的資源支持。比如說,你需要為不同的螢幕解析度提供替代的圖片資源,為不同的語言提供替代的字串資源。在運行時,Android 檢測當前設備配置,並為應用程式加載合適的資源。
要為特定的配置的確定一系列替代資源,遵循如下的步驟:
- 在res/ 下創建一個新的目錄,以 <resource_name>_<config_qualifier> 的方式命名。這裏的 resources_name 是上表中提到的任意資源,如佈局、圖片等。 qualifier 將確定個性的配置使用哪些資源。你可以查看官方文檔來瞭解不同類型資源的一個完整 qualifier 列表。
- 在這個目錄中保存回應的替代資源。這些資源檔必須與下麵例子中展示的默認資源檔案名一致,然而這些檔將確定的內容進行替代。例如:雖然圖片的檔案名一樣,但是高解析度的螢幕,圖片的解析度也會高。
下麵是一個例子,指定默認螢幕的圖片和高解析度的替代圖片。
MyProject/ src/ main/ java/ MyActivity.java res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png layout/ activity_main.xml info.xml values/ strings.xml
下麵是另外一個例子,指定默認語言的佈局和阿拉伯語言的替代佈局。
MyProject/ src/ main/ java/ MyActivity.java res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png layout/ activity_main.xml info.xml layout-ar/ main.xml values/ strings.xml
訪問資源
在應用程式開發中,需要訪問定義好的資源,不論是通過代碼還是通過 XML 檔。下麵的章節介紹如何分別在這兩種場景中訪問資源。
在代碼訪問資源
當 Android 應用程式被編譯,生成一個 R 類,其中包含了所有 res/ 目錄下資源的 ID。你可以使用 R 類,通過子類+資源名或者直接使用資源 ID 來訪問資源。
實例
訪問 res/drawable/myimage.png,並將其設置到 ImageView 上,你將使用以下代碼:
ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage);
這裏第一行代碼用 R.id.myimageview 來在佈局檔中獲取定義為 myimageview 的 ImageView。第二行用 R.drawable.myimage 來獲取在 res/ 的 drawable 子目錄下名為 myimage 的圖片。
實例
考慮下一個例子,其中 res/values/strings.xml 有如下定義:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello, World!</string> </resources>
現在你可以在 ID 為 msg 的 TextView 對象上使用資源 ID 來設置文本,具體如下:
TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello);
實例
考慮如下定義的佈局 res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout>
這個應用程式代碼將為活動加載這個佈局,onCreate() 方法中如下:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); }
在XML中訪問
考慮下麵的 XML 資源檔 res/values/strings.xml,其中包含一個顏色資源和一個字串資源 -
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
現在,你可以在下面的佈局檔中使用這些資源來設置文本顏色和文本內容:
<?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="@color/opaque_red" android:text="@string/hello" />
現在,你如果再次回到上一章節講解的" Hello World! "實例,我可以確定,你對這節中所有的概念有了更好的理解。所以,我強烈建議回去看看之前的實例,並查看我使用不同資源的基本用法。