Android – Tài nguyên (Resources)


Có nhiều thứ khác bạn cần để xây dựng một ứng dụng hay. Bên cạnh mã nguồn, bạn cũng phải quan tâm đến các tài nguyên mà mã nguồn sử dụng như bitmap, màu sắc, định nghĩa bố cục, chuỗi, chuyển hoạt (animation)… Các tài nguyên này luôn được lưu giữ riêng trong những thư mục khác nhau trong thư mục res/ của Project.

Sau đây chúng ta sẽ học cách quản lý các tài nguyên ứng dụng.

Quản lý các tài nguyên trong Eclipse

Bạn nên đặt mỗi loại tài nguyên trong từng thư mục con riêng trong thư mục res/. Sau đây là ví dụ cấu trúc thư mục chứa các tài nguyên của một ứng dụng đơn giản:

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

Trong thư mục res/, các tài nguyên hình ảnh trong thư mục drawable/, 2 tài nguyên bố cục đuôi .xml trong thư mục layout/ và chuỗi trong thư mục values/. Sau đây là danh sách các loại tài nguyên:

Thư mục Loại tài nguyên
anim/ Tập tin XML xác định các chuyển hoạt (animation). Chúng được lưu trong res/anim/ và được truy cập thông qua lớp R.anim.
color/ Tập tin XML xác định màu sắc (color). Chúng được lưu trong res/color/ và được truy cập thông qua lớp R.color.
drawable/ Các hình ảnh (image) đuôi .png, .jpg, .gif hoặc tập tin XML được biên dịch thành bitmap, state lists, kiểu dáng (shapes), hoạt họa (animation drawable). Chúng được lưu trong res/drawable/ và được truy cập thông qua lớp R.drawable.
layout/ Tập tin XML xác định bố cục giao diện (layout). Chúng được lưu trong res/layout/và được truy cập thông qua lớp R.layout.
menu/ Tập tin XML xác định Menu của ứng dụng, như là Options Menu, Context Menu, or Sub Menu. Chúng được lưu trong res/menu/ và được truy cập thông qua lớp R.menu.
raw/ Tập tin chứa dữ liệu thô, hay còn gọi là raw file. Bạn cần gọi phương thức Resources.openRawResource() với ID tài nguyên trong tập tin R.raw.filename để mở tập tin dữ liệu thô (raw file).
values/ Tập tin XML chứa các giá trị như là chuỗi (string), số nguyên (integer), màu sắc (color). Ví dụ, sau đây là một vài tài nguyên kiểu này bạn có thể tạo và lưu trong thư mục values/

  • arrays.xml chứa các mảng (array), được truy cập bởi lớp R.array.
  • integers.xml chứa các số nguyên (integer), được truy cập bởi lớp R.integer.
  • bools.xml chứa các giá trị đúng sai boolean, được truy cập bởi lớp R.bool.
  • colors.xml chứa các giá trị màu sắc (color), được truy cập bởi lớp R.color.
  • dimens.xml chứa các kích thước (dimension), được truy cập bởi lớp R.dimen.
  • strings.xml chứa các chuỗi (string), được truy cập bởi lớp R.string class.
  • styles.xml chứa các kiểu mẫu (style), được truy cập bởi lớp R.style.
xml/ Tập tin XML, có thể được đọc trong quá trình chạy bằng cách gọi phương thức Resources.getXML(). Bạn có thể lưu nhiều tập tin cấu hình khác nhau và chúng sẽ được gọi khi chạy chương trình.

Tài nguyên thay thế (Alternative Resources)

Ứng dụng của bạn cần cung cấp tài nguyên khác nhau cho các thiết bị khác nhau. Ví dụ bạn nên cung cấp hình ảnh với các độ phân giải khác nhau cho từng loại thiết bị hoặc chuỗi khác nhau cho từng ngôn ngữ. Khi ứng dụng chạy, nó sẽ tự động xác định cấu hình thiết bị và các tài nguyên tương ứng sẽ được sử dụng. Để tạo Tài nguyên thay thế, làm theo các bước sau:

  • Trong thư mục res/ tạo một thư mục đặt tên có dạng sau <resources_name>-<config_qualifier>. Trong đó resources_name là tên loại tài nguyên trong danh sách bên trên. qualifier sẽ xác định cấu hình thiết bị mà tài nguyên trong thư mục này được sử dụng. Bạn có thể tham khảo tài liệu chính thức về danh sách các qualifiers cho từng loại tài nguyên tại đây.
  • Lưu tài nguyên thay thế trong thư mục này, tên tập tin phải giống hệt tên của tập tin tài nguyên trong thư mục chứa tài nguyên mặc định, nhưng các tập tin này chứa nội dung đặc biệt dành cho loại cấu hình này. Ví dụ đối với tập tin hình ảnh, tuy là cùng một tên nhưng ở thư mục mặc định, độ phân giải sẽ khác, còn ở thư mục tài nguyên dành cho màn hình lớn hơn, ảnh sẽ có độ phân giải cao hơn.

Dưới đây là ví dụ về thay thế hình ảnh cho thiết bị có độ phân giải cao.

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 

Còn bên dưới là một ví dụ khác để thay thế bố cục khác cho ngôn ngữ Ả Rập (Arabic):

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 

Truy cập tài nguyên

Khi lập trình ứng dụng Android, ban sẽ  cần truy cập tới tài nguyên hoặc là trong mã nguồn hoặc là trong tập tin XML. Sau đây tôi sẽ giải thích rõ hơn về việc truy cập tài nguyên.

Truy cập tài nguyên trong code

Khi ứng dụng Android được biên dịch, a tập tin lớp R.java được tạo ra. Trong tập tin này có chứa ID của các tài nguyên trong thư mục res/. Bạn có thể dùng tập tin R.java để truy cập tới một tài nguyên bằng cách chỉ ra thư mục con và tên tài nguyên hay là dùng trực tiếp ID của tài nguyên đó.

Ví dụ

Để truy cập vào res/drawable/myimage.png xác định hình ảnh cho một thực thể lớp ImageView bạn viết code như sau:

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

Dòng đầu tiên truy cập tới ImageView được xác định trong tập tin Layout, ID của nó là myimageview. Dòng thứ 2 muốn gán hình ảnh với ID myimage trong /res/drawable/ cho tài nguyên có ID myimageview.

Ví dụ

Ví dụ trong ví dụ kế tiếp tập tin res/values/strings.xml có nội dung như bên dưới:

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

Bây giờ bạn có thể thiết lập thuộc tính text của TextView với ID là msg với chuỗi có tên hello như sau:

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

Ví dụ

Ví dụ tập tin bố cục res/layout/activity_main.xml có nội dung như sau:

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

Chúng ta sẽ viết đoạn code đươi đây để khởi tạo layout cho một Activity trong phương thức onCreate():

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

Truy cập tài nguyên trong XML

Giả dụ rằng tập tin tài nguyên XML res/values/strings.xml có chứa 1 tài nguyên color và 1 tài nguyên string.

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

Bây giờ bạn có thể dụng 2 tài nguyên này trong tập tin layout để xác định màu và text trong tập tin xml như sau:

<?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/dark_blue"
    android:text="@string/hello" />
963 Total Views 2 Views Today