Android 資源(Resources)管理

2021-10-21 11:39 更新

Android 資源(Resources)訪問

有許多東西用來構(gòu)建一個(gè)優(yōu)秀的 Android 應(yīng)用程序。除了應(yīng)用程序的編碼,你需要關(guān)注各種各樣的資源,諸如你用到的各種靜態(tài)內(nèi)容,如位圖,顏色,布局定義,用戶界面字符串,動(dòng)畫等等。這些資源一般放置在項(xiàng)目的 res/ 下獨(dú)立子目錄中。

這節(jié)教程將學(xué)習(xí)如何來組織應(yīng)用程序資源,指定替代資源,并在應(yīng)用程序中訪問它們。


在eclipse中組織資源

你需要將每種資源放置在項(xiàng)目中 res/ 目錄的特定子目錄下。例如,這是一個(gè)簡單項(xiàng)目的文件層級(jí):

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            icon.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml 

res/ 目錄在各種子目錄中包含了所有的資源。這里有一個(gè)圖片資源,兩個(gè)布局資源和一個(gè)字符串資源文件。下表詳細(xì)的給出了在項(xiàng)目中 res/ 目錄里面支持的資源。

目錄資源類型
anim/定義動(dòng)畫屬性的XML文件。它們被保存在res/anim/文件夾下,通過R.anim類訪問
color/定義顏色狀態(tài)列表的XML文件。它們被保存在res/color/文件夾下,通過R.color類訪問
drawable/圖片文件,如.png,.jpg,.gif或者XML文件,被編譯為位圖、狀態(tài)列表、形狀、動(dòng)畫圖片。它們被保存在res/drawable/文件夾下,通過R.drawable類訪問
layout/定義用戶界面布局的XML文件。它們被保存在res/layout/文件夾下,通過R.layout類訪問
menu/定義應(yīng)用程序菜單的XML文件,如選項(xiàng)菜單,上下文菜單,子菜單等。它們被保存在res/menu/文件夾下,通過R.menu類訪問
raw/任意的文件以它們的原始形式保存。需要根據(jù)名為R.raw.filename的資源ID,通過調(diào)用Resource.openRawResource()來打開raw文件
values/包含簡單值(如字符串,整數(shù),顏色等)的XML文件。這里有一些文件夾下的資源命名規(guī)范。arrays.xml代表數(shù)組資源,通過R.array類訪問;integers.xml代表整數(shù)資源,通過R.integer類訪問;bools.xml代表布爾值資源,通過R.bool類訪問;colors.xml代表顏色資源,通過R.color類訪問;dimens.xml代表維度值,通過R.dimen類訪問;strings.xml代表字符串資源,通過R.string類訪問;styles.xml代表樣式資源,通過R.style類訪問
xml/可以通過調(diào)用Resources.getXML()來在運(yùn)行時(shí)讀取任意的XML文件??梢栽谶@里保存運(yùn)行時(shí)使用的各種配置文件

替代資源

你的應(yīng)用程序需要為特定的設(shè)備配置提供替代的資源支持。比如說,你需要為不同的屏幕分辨率提供替代的圖片資源,為不同的語言提供替代的字符串資源。在運(yùn)行時(shí),Android 檢測當(dāng)前設(shè)備配置,并為應(yīng)用程序加載合適的資源。

要為特定的配置的確定一系列替代資源,遵循如下的步驟:

  • 在res/ 下創(chuàng)建一個(gè)新的目錄,以 <resource_name>_<config_qualifier> 的方式命名。這里的 resources_name 是上表中提到的任意資源,如布局、圖片等。 qualifier 將確定個(gè)性的配置使用哪些資源。你可以查看官方文檔來了解不同類型資源的一個(gè)完整 qualifier 列表。
  • 在這個(gè)目錄中保存響應(yīng)的替代資源。這些資源文件必須與下面例子中展示的默認(rèn)資源文件名一致,然而這些文件將確定的內(nèi)容進(jìn)行替代。例如:雖然圖片的文件名一樣,但是高分辨率的屏幕,圖片的分辨率也會(huì)高。

下面是一個(gè)例子,指定默認(rèn)屏幕的圖片和高分辨率的替代圖片。

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

下面是另外一個(gè)例子,指定默認(rèn)語言的布局和阿拉伯語言的替代布局。

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

訪問資源

在應(yīng)用程序開發(fā)中,需要訪問定義好的資源,不論是通過代碼還是通過 XML 文件。下面的章節(jié)介紹如何分別在這兩種場景中訪問資源。

在代碼訪問資源

當(dāng) Android 應(yīng)用程序被編譯,生成一個(gè) R 類,其中包含了所有 res/ 目錄下資源的 ID。你可以使用 R 類,通過子類+資源名或者直接使用資源 ID 來訪問資源。

實(shí)例

訪問 res/drawable/myimage.png,并將其設(shè)置到 ImageView 上,你將使用以下代碼:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

這里第一行代碼用 R.id.myimageview 來在布局文件中獲取定義為 myimageview 的 ImageView。第二行用 R.drawable.myimage 來獲取在 res/ 的 drawable 子目錄下名為 myimage 的圖片。

實(shí)例

考慮下一個(gè)例子,其中 res/values/strings.xml 有如下定義:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string  name="hello">Hello, World!</string>
</resources>

現(xiàn)在你可以在 ID 為 msg 的 TextView 對(duì)象上使用資源 ID 來設(shè)置文本,具體如下:

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

實(shí)例

考慮如下定義的布局 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>

這個(gè)應(yīng)用程序代碼將為活動(dòng)加載這個(gè)布局,onCreate() 方法中如下:

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main_activity);
}

在XML中訪問

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

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

現(xiàn)在,你可以在下面的布局文件中使用這些資源來設(shè)置文本顏色和文本內(nèi)容:

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

現(xiàn)在,你如果再次回到上一章節(jié)講解的" Hello World! "實(shí)例,我可以確定,你對(duì)這節(jié)中所有的概念有了更好的理解。所以,我強(qiáng)烈建議回去看看之前的實(shí)例,并查看我使用不同資源的基本用法。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)