Android 資源(Resources)管理

2021-10-21 11:39 更新

Android 資源(Resources)訪問(wèn)

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

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


在eclipse中組織資源

你需要將每種資源放置在項(xiàng)目中 res/ 目錄的特定子目錄下。例如,這是一個(gè)簡(jiǎn)單項(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/ 目錄里面支持的資源。

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

替代資源

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

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

  • 在res/ 下創(chuàng)建一個(gè)新的目錄,以 <resource_name>_<config_qualifier> 的方式命名。這里的 resources_name 是上表中提到的任意資源,如布局、圖片等。 qualifier 將確定個(gè)性的配置使用哪些資源。你可以查看官方文檔來(lái)了解不同類(lèi)型資源的一個(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)語(yǔ)言的布局和阿拉伯語(yǔ)言的替代布局。

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

訪問(wèn)資源

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

在代碼訪問(wèn)資源

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

實(shí)例

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

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

這里第一行代碼用 R.id.myimageview 來(lái)在布局文件中獲取定義為 myimageview 的 ImageView。第二行用 R.drawable.myimage 來(lái)獲取在 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 來(lái)設(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中訪問(wèn)

考慮下面的 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)在,你可以在下面的布局文件中使用這些資源來(lái)設(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)