lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

存取資源

提供應用程式中的資源 (於提供資源中討論) 後,您可以參照其資源 ID 加以應用。所有資源 ID 會在專案的 R 類別中定義。此類別是由 aapt 工具自動產生的。

編譯應用程式後,aapt 會產生 R 類別。此類別內含 res/ 目錄中所有資源的資源 ID。 每一種資源類型都有 R 子類別 (例如,所有可繪項目資源的 R.drawable),而這種類型的每一種資源都有靜態整數 (例如,R.drawable.icon)。 此整數就是資源 ID,您可以用於擷取資源。

儘管資源 ID 都指定於 R 類別,您不需要為了取得資源 ID 而加以查看。資源 ID 的組成如下:

  • 資源類型:每一種資源會以「類型」分類,例如 stringdrawable 以及 layout。如需有關不同類型的詳細資訊,請參閱資源類型
  • 資源名稱可能是:檔案名稱,不含副檔名;或 XML android:name 屬性中的值,如果資源是簡單值 (例如字串)。

您有兩種方式可存取資源:

  • 在程式碼中:使用 R 類別中子類別的靜態整數,例如:
    R.string.hello

    string 是資源類型,而 hello 是資源名稱。若您以此格式提供資源 ID 時,很多 Android API 都可以存取您的資源。 請參閱在程式碼中存取資源

  • 在 XML 中:使用特殊 XML 語法,也可以對應到您在 R 類別中定義的資源 ID,例如:
    @string/hello

    string 是資源類型,而 hello 是資源名稱。您可以在 XML 資源中的任何位置使用此語法,只要符合您在資源中所提供的預期值即可。 請參閱存取 XML 中的資源

在程式碼中存取資源

您可以將資源 ID 作為方法參數傳遞,在程式碼中使用資源。例如,您可以利用 setImageResource()ImageView 設定為使用 res/drawable/myimage.png 資源:

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

您也可以使用 Resources (以 getResources() 可取得執行個體) 中的方法擷取個別的資源。

語法

在程式碼中參照資源的語法如下:

[<package_name>.]R.<resource_type>.<resource_name>
  • &lt;package_name&gt; 資源所在的封裝名稱 (從您自己的封裝中參照資源時,不需要此名稱)。
  • &lt;resource_type&gt; 是資源類型的 R 子類別。
  • &lt;resource_name&gt; 可以是不含副檔名的資源檔案名稱,或是 XML 元素中的 android:name 屬性值 (簡單值)。

請參閱資源類型,以取得關於每個資源類型及其參照方式的詳細資訊。

使用案例

很多方法都接受資源 ID 參數,您可以使用 Resources 中的方法擷取資源。您可以透過以下方式取得 Resources 的執行個體:Context.getResources()

以下是在程式碼中存取資源的範例:

// Load a background for the current screen from a drawable resource
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

注意:您不應手動修改 R.java 檔案 — 此檔案是在編譯專案時由 aapt 工具所產生。 下次編譯時會覆寫所有變更內容。

存取 XML 中的資源

您可以使用現有資源的參照,為某些 XML 屬性和元素定義值。 您在建立版面配置檔案時,會經常以此方式提供字串和影像讓小工具使用。

例如,如果您要將 Button 加入版面配置,應該使用按鈕文字的字串資源

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

語法

在 XML 資源中參照資源的語法如下:

@[<package_name>:]<resource_type>/<resource_name>
  • &lt;package_name&gt; 資源所在的封裝名稱 (從同一個封裝中參照資源時,不需要此名稱)
  • &lt;resource_type&gt; 是資源類型的 R 子類別。
  • &lt;resource_name&gt; 可以是不含副檔名的資源檔案名稱,或是 XML 元素中的 android:name 屬性值 (簡單值)。

請參閱資源類型,以取得關於每個資源類型及其參照方式的詳細資訊。

使用案例

有時候您必須在 XML 中使用資源,而不能使用值 (例如,將可繪項目影像套用至小工具)。不過,您也可以在 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" />

在此情況下,您不用在資源參照中指定封裝名稱,因為資源是來自您自己的封裝。 如要參照系統資源,則需要使用封裝名稱。 範例:

<?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="@android:color/secondary_text_dark"
    android:text="@string/hello" />

注意:您一律都要使用字串資源,便於應用程式當地語系化。 如需關於建立替代資源 (例如當地語系化的字串) 的詳細資訊,請參閱提供替代資源。 如需將應用程式當地語系化的詳細指南,請參閱當地語系化

您甚至可以在 XML 中使用資源以建立別名。例如:您可以用其他可繪項目資源的別名,建立可繪項目資源:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

聽起來多此一舉,但是,當您使用替代資源時,就非常實用。深入瞭解建立別名資源

參照樣式屬性

樣式屬性資源可以讓您在目前套用的設計風格中參照屬性的值。 參照樣式屬性可以讓您透過目前設計風格提供的標準變化自訂 UI 元素外觀,而不需要使用硬式編碼值。 參照樣式屬性基本上就是「使用目前設計風格中此屬性所定義的樣式」。

如要參照樣式屬性,名稱語法幾乎和一般資源格式相同,只要把小老鼠符號 (@) 換成問號 (?) 即可,而且您可以選擇是否要使用資源類型。 範例:

?[<package_name>:][<resource_type>/]<resource_name>

例如,您可以參照屬性,讓文字色彩符合系統設計風格的「主要」文字色彩,方式如下:

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

這裡的 android:textColor 屬性指出目前設計風格中樣式屬性的名稱。 Android 現在會將套用至 android:textColorSecondary 樣式屬性的值,當成此小工具中 android:textColor 的值。 因為系統資源工具知道在此環境中會有一個屬性資源,您不需要明確陳述其類型 ( ?android:attr/textColorSecondary)— 可以不需要寫上出 attr 類型。

存取平台資源

Android 內含多種標準資源,例如樣式、設計風格以及版面配置。如要存取這些資源,則必須在參照資源時使用 android 封裝名稱。 例如,Android 在 ListAdapter 中提供版面配置資源,您可以用於列出項目:

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

在此範例中,simple_list_item_1 是一個版面配置資源,由平台為 ListView 中的項目所定義。 您可以加以使用,而不用自行建立清單項目的版面配置。 如需詳細資訊,請參閱清單檢視開發人員指南。