Latest web development tutorials

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() 方法中如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

在XML中訪問

考慮下面的XML 資源文件res/values/strings.xml,其中包含一個顏色資源和一個字符串資源-

<?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" />

現在,你可以在下面的佈局文件中使用這些資源來設置文本顏色和文本內容:

<code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;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" /&gt;
</code>

現在,你如果再次回到上一章節講解的" Hello World! "實例,我可以確定,你對這節中所有的概念有了更好的理解。 所以,我強烈建議回去看看之前的實例,並查看我使用不同資源的基本用法。