page.title=Truy cập Tài nguyên parent.title=Tài nguyên Ứng dụng parent.link=index.html @jd:body
Sau khi cung cấp một tài nguyên trong ứng dụng của mình (đề cập trong Cung cấp Tài nguyên), bạn có thể áp dụng nó bằng cách tham chiếu ID tài nguyên đó. Tất cả ID tài nguyên được định nghĩa trong lớp {@code R} dự án của bạn, do công cụ {@code aapt} tự động khởi tạo.
Khi ứng dụng của bạn được biên dịch, {@code aapt} khởi tạo lớp {@code R}, trong đó chứa ID tài nguyên cho tất cả tài nguyên trong thư mục {@code res/} của bạn. Với mỗi loại tài nguyên, có một lớp con {@code R} (ví dụ, {@code R.drawable} cho tất cả tài nguyên có thể vẽ), và với mỗi tài nguyên loại đó, có một số nguyên tĩnh (ví dụ, {@code R.drawable.icon}). Số nguyên này là ID tài nguyên mà bạn có thể sử dụng để truy xuất tài nguyên của mình.
Mặc dù lớp {@code R} là nơi các ID tài nguyên được quy định, bạn sẽ không cần tìm ở đó để khám phá một ID tài nguyên. Một ID tài nguyên luôn bao gồm:
Có hai cách để bạn có thể truy cập một tài nguyên:
R.string.hello
{@code string} là loại tài nguyên và {@code hello} là tên tài nguyên. Có nhiều API Android mà có thể truy cập các tài nguyên của bạn khi bạn cung cấp một ID tài nguyên theo định dạng này. Xem Truy cập Tài nguyên trong Mã.
@string/hello
{@code string} là loại tài nguyên và {@code hello} là tên tài nguyên. Bạn có thể sử dụng cú pháp này trong một tài nguyên XML ở bất kỳ nơi nào có kỳ vọng một giá trị mà bạn cung cấp trong một tài nguyên. Xem phần Truy cập Tài nguyên từ XML.
Bạn có thể sử dụng một tài nguyên trong mã bằng cách chuyển ID tài nguyên như một tham số phương pháp. Ví dụ, bạn có thể đặt một {@link android.widget.ImageView} để sử dụng tài nguyên {@code res/drawable/myimage.png} bằng cách sử dụng {@link android.widget.ImageView#setImageResource(int) setImageResource()}:
ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage);
Bạn cũng có thể truy xuất các tài nguyên riêng lẻ bằng các phương pháp trong {@link android.content.res.Resources}, theo đó bạn có thể nhận được một thực thể bằng {@link android.content.Context#getResources()}.
Tuy không thường gặp, song bạn có thể cần truy cập các tệp và thư mục gốc của mình. Nếu bạn làm vậy thì việc lưu các tệp của bạn trong {@code res/} sẽ không có tác dụng với bạn, vì cách duy nhất để đọc một tài nguyên từ {@code res/} đó là bằng ID tài nguyên. Thay vào đó, bạn có thể lưu các tài nguyên của mình trong thư mục {@code assets/}.
Các tệp lưu trong thư mục {@code assets/} không được cấp ID tài nguyên , vì thế bạn không thể tham chiếu chúng thông qua lớp {@code R} hoặc từ các tài nguyên XML. Thay vào đó, bạn có thể truy vấn các tệp trong thư mục {@code assets/} như một hệ thống tệp bình thường và đọc dữ liệu thô bằng cách sử dụng {@link android.content.res.AssetManager}.
Tuy nhiên, nếu tất cả những gì bạn yêu cầu là khả năng đọc dữ liệu thô (chẳng hạn như một tệp video hoặc âm thanh), vậy bạn hãy lưu tệp trong thư mục {@code res/raw/} và đọc một luồng byte bằng cách sử dụng {@link android.content.res.Resources#openRawResource(int) openRawResource()}.
Sau đây là cú pháp để tham chiếu một tài nguyên trong mã:
[<package_name>.]R.<resource_type>.<resource_name>
Xem phần Loại Tài nguyên để biết thêm thông tin về mỗi loại tài nguyên và cách tham chiếu chúng.
Có nhiều phương pháp chấp nhận một tham số ID tài nguyên và bạn có thể truy xuất tài nguyên bằng cách sử dụng các phương pháp trong {@link android.content.res.Resources}. Bạn có thể lấy một thực thể {@link android.content.res.Resources} bằng {@link android.content.Context#getResources Context.getResources()}.
Sau đây là một số ví dụ về truy cập tài nguyên trong mã:
// Load a background for the current screen from a drawable resource {@link android.app.Activity#getWindow()}.{@link android.view.Window#setBackgroundDrawableResource(int) 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 {@link android.app.Activity#getWindow()}.{@link android.view.Window#setTitle(CharSequence) setTitle}(getResources().{@link android.content.res.Resources#getText(int) getText}(R.string.main_title)); // Load a custom layout for the current screen {@link android.app.Activity#setContentView(int) setContentView}(R.layout.main_screen); // Set a slide in animation by getting an Animation from the Resources object mFlipper.{@link android.widget.ViewAnimator#setInAnimation(Animation) 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.{@link android.widget.TextView#setText(int) setText}(R.string.hello_message);
Chú ý: Bạn không nên sửa đổi tệp {@code R.java} bằng cách thủ công—nó được khởi tạo bởi công cụ {@code aapt} khi dự án của bạn được biên dịch. Mọi thay đổi đều bị ghi đè vào lần biên dịch tới của bạn.
Bạn có thể định nghĩa các giá trị cho một số thuộc tính và phần tử XML bằng cách sử dụng một tham chiếu tới một tài nguyên hiện có. Bạn sẽ thường làm điều này khi tạo các tệp bố trí, để cung cấp các xâu và hình ảnh cho widget của mình.
Ví dụ, nếu thêm một {@link android.widget.Button} vào bố trí của mình, bạn nên sử dụng một tài nguyên xâu cho văn bản nút:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/submit" />
Sau đây là cú pháp để tham chiếu một tài nguyên trong một tài nguyên XML:
@[<package_name>:]<resource_type>/<resource_name>
Xem phần Loại Tài nguyên để biết thêm thông tin về mỗi loại tài nguyên và cách tham chiếu chúng.
Trong một số trường hợp bạn phải sử dụng một tài nguyên cho một giá trị trong XML (ví dụ, để áp dụng một hình ảnh có thể vẽ cho một widget), nhưng bạn cũng có thể sử dụng một tài nguyên trong XML ở bất kỳ nơi nào chấp nhận một giá trị đơn giản. Ví dụ, nếu bạn có tệp tài nguyên sau bao gồm một tài nguyên màu và một tài nguyên xâu:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
Bạn có thể sử dụng những tài nguyên này trong tệp bố trí sau để đặt màu văn bản và xâu văn bản:
<?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" />
Trong trường hợp này, bạn không cần quy định tên gói trong tham chiếu tài nguyên đó vì tài nguyên xuất phát từ gói của chính bạn. Để tham chiếu một tài nguyên hệ thống, bạn sẽ cần đưa vào tên gói. Ví dụ:
<?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" />
Lưu ý: Bạn nên sử dụng các tài nguyên xâu vào mọi lúc, để ứng dụng của bạn có thể được bản địa hóa cho các ngôn ngữ khác. Để biết thông tin về việc tạo các tài nguyên thay thế (chẳng hạn như xâu được bản địa hóa), hãy xem phần Cung cấp Tài nguyên Thay thế. Để được hướng dẫn đầy đủ về việc bản địa hóa ứng dụng của bạn cho các ngôn ngữ khác, hãy xem phần Bản địa hóa.
Bạn thậm chí có thể sử dụng tài nguyên trong XML để tạo các bí danh. Ví dụ, bạn có thể tạo một tài nguyên có thể vẽ là một bí danh cho một tài nguyên có thể vẽ khác:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/other_drawable" />
Nghe có vẻ thừa, nhưng có thể rất hữu ích khi sử dụng tài nguyên thay thế. Đọc thêm về Tạo tài nguyên bí danh.
Một tài nguyên thuộc tính kiểu sẽ cho phép bạn tham chiếu giá trị của một thuộc tính trong chủ đề đang áp dụng. Tham chiếu một thuộc tính kiểu sẽ cho phép bạn tùy chỉnh diện mạo của các phần tử UI bằng cách tạo kiểu cho chúng để phù hợp với các biến đổi tiêu chuẩn được cung cấp bởi chủ đề hiện tại, thay vì cung cấp một giá trị được mã hóa cố định. Tham chiếu một thuộc tính kiểu về cơ bản mà nói, là "sử dụng kiểu được định nghĩa bởi thuộc tính này, trong chủ đề hiện tại."
Để tham chiếu một thuộc tính kiểu, cú pháp tên gần như tương tự với định dạng tài nguyên thường , nhưng thay vì biểu tượng @ ({@code @}), hãy sử dụng một dấu hỏi ({@code ?}), và phần loại tài nguyên là tùy chọn. Ví dụ:
?[<package_name>:][<resource_type>/]<resource_name>
Ví dụ, sau đây là cách bạn có thể tham chiếu một thuộc tính để đặt màu văn bản cho phù hợp với màu văn bản "chính" của chủ đề hệ thống:
<EditText id="text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="?android:textColorSecondary" android:text="@string/hello_world" />
Ở đây, thuộc tính {@code android:textColor} quy định tên của một thuộc tính kiểu
trong chủ đề hiện tại. Hiện nay, Android sử dụng giá trị được áp dụng cho thuộc tính kiểu {@code android:textColorSecondary}
làm giá trị cho {@code android:textColor} trong widget này. Vì công cụ tài nguyên
hệ thống biết rằng một tài nguyên thuộc tính sẽ được yêu cầu trong ngữ cảnh này,
bạn không cần nêu rõ loại (mà sẽ là
?android:attr/textColorSecondary
)—bạn có thể không nêu loại {@code attr}.
Android bao gồm nhiều tài nguyên tiêu chuẩn, chẳng hạn như kiểu, chủ đề và bố trí. Để
truy cập các tài nguyên này, hãy xác định tham chiếu tài nguyên của bạn bằng tên gói
android
. Ví dụ, Android cung cấp một tài nguyên bố trí bạn có thể sử dụng cho
các mục danh sách trong một {@link android.widget.ListAdapter}:
{@link android.app.ListActivity#setListAdapter(ListAdapter) setListAdapter}(new {@link android.widget.ArrayAdapter}<String>(this, android.R.layout.simple_list_item_1, myarray));
Trong ví dụ này, {@link android.R.layout#simple_list_item_1} là một tài nguyên bố trí được định nghĩa bởi nền tảng cho các mục trong một {@link android.widget.ListView}. Bạn có thể sử dụng điều này thay vì tạo bố trí riêng của mình cho các mục danh sách. Để biết thêm thông tin, hãy xem phần Dạng xem Danh sách trong hướng dẫn cho nhà phát triển.