Android: Resource trong Android

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Bên cạnh việc viết code cho ứng dụng, bạn cũng cần quan tâm đến các Resource (tài nguyên) khác, chẳng hạn nội dung tĩnh mà code của bạn sử dụng như bitmap, color, layout, UI, … Những resource này là luôn luôn được duy trì riêng rẽ trong các thư mục con dưới thư mục tên res/ của project.

Bài viết này hướng dẫn cho bạn cách tổ chức các resource, xác định resource thay thế và truy cập chúng trong các ứng dụng của bạn.

Tổ chức Resource trong Android Studio

MyProject/
  main/
    java/
	  MainActivity.java      
    res/
      anim/
        anim_alpha.xml
      color
      drawable/  
        ic_launcher_background.xml
      layout/  
        activity_main.xml
      values/
        colors.xml
        strings.xml
        styles.xml
Thư mục Kiểu Resource
anim/ Các file XML định nghĩa thuộc tính hiệu ứng (animation). Chúng được lưu giữ trong thư mục res/anim/ và được truy cập từ lớp R.anim.
color/ Các file XML định nghĩa danh sách trạng thái của màu. Chúng được lưu giữ trong thư mục res/color/ và được truy cập từ lớp R.color.
drawable/ Các file ảnh như .png, .jpg, .gif hoặc XML được biên dịch vào trong bitmap, state list, shape, animation drawable. Chúng được lưu giữ trong res/drawable/ và được truy cập từ lớp R.drawable.
layout/ File XML định nghĩa bố cục giao diện người dùng. Chúng được lưu trong thư mục res/layout/ và được truy cập từ lớp R.layout.
menu/ File XML định nghĩa một UI layout. Chúng được lưu giữ trong res/menu/ và được truy cập từ lớp R.menu.
raw/ Các file riêng để lưu giữ dưới dạng raw. Bạn cần gọi Resources.openRawResource() với resource ID, là R.raw.filename để mở các raw file này
values/ File XML chứa các giá trị đơn giản, ví dụ chuỗi, số nguyên, màu, style. Ví dụ, dưới đây là một số tên file qui ước cho các Resource bạn có thể tạo trong thư mục này:
  • arrays.xml cho các mảng và được truy cập từ lớp R.array
  • integers.xml cho số nguyên và được truy cập từ lớp R.integer
  • bools.xml cho boolean, và được truy cập từ lớp R.bool
  • colors.xml cho các giá trị màu, và được truy cập từ lớp R.color
  • dimens.xml cho các giá trị chiều, và được truy cập từ lớp R.dimen
  • strings.xml cho các giá trị chuỗi, và được truy cập từ lớp R.string
  • styles.xml cho các style, và được truy cập từ lớp R.style
xml/ Các XML file riêng có thể được đọc tại thời điểm runtime bằng cách gọi phương thức Resources.getXML(). Bạn có thể lưu giữ các file cấu hình đa dạng tại đây, các file này sẽ được sử dụng trong quá trình runtime

Resource để thay thế trong Android

Ứng dụng của bạn nên cung cấp các Resource thay thế để hỗ trợ cho các cấu hình thiết bị cụ thể. Ví dụ, bạn nên cung cấp các Drawable Resource thay thế (ví dụ image) cho các màn hình có độ phân giải khác nhau và String Resource thay thế cho các ngôn ngữ khác nhau. Tại runtime, Android dò cấu hình thiết bị hiện tại và tải Resource thích hợp cho ứng dụng của bạn.

Để xác định cấu hình thay thế cho một tập các Resource, bạn làm theo các bước sau:

  • Tạo một thư mục mới trong res/ với tên dạng <resources_name>-<config_qualifier>. Ở đây resources_name sẽ là bất kỳ Resource nào đã đề cập trong bảng trên, như layout, drawable, … Qualifier sẽ xác định cấu hình riêng cho các Resource được sử dụng.
  • Lưu Resource thay thế tương ứng trong thư mục mới này. Resource file phải được đặt tên chính xác như Resource file mặc định trong ví dụ dưới đây, nhưng các file này có nội dung cụ thể để Resource thay thế. Ví dụ, mặc dù tên file image sẽ là giống nhau, nhưng với màn hình có độ phân giải cao, thì độ phân giải của nó sẽ là cao.

Ví dụ dưới đây xác định các image cho một màn hình mặc định và image thay thế cho màn hình có độ phân giải cao:

MainProject/
  main/
	java/
	  MainActivity.java  
    res/
      drawable/  
        icon.png
        background.png
      drawable-hdpi/  
        icon.png
        background.png  
      layout/
        activity_main.xml
        info.xml
      values/
        strings.xml

Còn ví dụ sau xác định layout cho một ngôn ngữ mặc định và layout thay thế cho ngôn ngữ Arabic.

MainProject/
  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 Resource trong Android

Trong suốt quá trình phát triển ứng dụng, bạn sẽ cần truy cập các Resource đã định nghĩa hoặc trong code của bạn hoặc trong tập tin XML layout. Phần tiếp theo ta cần nắm được cách truy cập các Resource trong cả hai tình huống.

Truy cập Resource trong code

Khi ứng dụng Android của bạn được biên dịch thì một lớp R được tạo, lớp này chứa Resource ID cho tất cả các nguồn có sẵn trong thư mục res/. Bạn có thể sử dụng lớp R để truy cập các Resource đó bằng cách sử dụng thư mục phụ và tên Resource hoặc trực tiếp bằng Resource ID.

Ví dụ 1

Để truy cập res/drawable/myimage.png và thiết lập một ImageView, bạn có thể sử dụng code sau:

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

Ở đây, dòng code đầu tiên sử dụng R.id.myimageview để lấy ImageView đã được định nghĩa với id là myimageview trong một layout file. Dòng thứ hai sử dụng R.drawable.myimage để lấy một image với tên myimage có sẵn trong thư mục phụ /drawable trong thư mục /res.

Ví dụ 2

Trong ví dụ này, res/values/strings.xml có định nghĩa sau:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">DragAndDropV1Study</string>
    <string name="logo">Logo</string>
    <string name="v1study">V1Study</string>
    <string name="drag_and_drop_example">Drag and Drop example</string>
</resources>

Bây giờ, bạn có thể thiết lập text trên một đối tượng TextView với ID là msg bằng cách sử dụng một Resource ID như sau:

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

Trong đoạn code trên, R.string.hello mang nghĩa sau: Truy cập vào string có name là "hello" nằm trong file strings.xml, và file strings.xml nằm trong thư mục values/, thư mục values/ lại nằm trong thư mục res/.

Ví dụ 3

Bạn hãy xem một layout là res/layout/activity_main.xml có định nghĩa sau:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/drag_and_drop_example"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintVertical_bias="0.136" tools:text="@string/drag_and_drop_example"
            android:textSize="30sp"
            android:textColor="@color/colorTitle" android:textStyle="bold" android:id="@+id/title"/>
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/v1study"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.236" tools:text="V1Study" android:textSize="24sp"
            android:textColor="#8BC34A" android:textStyle="bold" android:id="@+id/academy"/>
    <ImageView
            android:layout_width="170dp"
            android:layout_height="170dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.493"
            app:layout_constraintVertical_bias="0.391"
            android:id="@+id/logo" tools:srcCompat="@mipmap/logo_v1_regular" android:contentDescription="@string/logo"
            app:srcCompat="@mipmap/logo_v1_regular"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Thì đoạn code trên sẽ tải layout cho một Activity trong phương thức onCreate(), cụ thể như sau:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

Truy cập Resource trong XML

Bạn để ý trong thư mục res/values/ có hai resource tên colors.xml và strings.xml. Ta hoàn toàn có thể sử dụng các Resource này trong file layout bằng cách sử dụng @ để gọi như thể hiện ở đoạn code sau trong file activity_main.xml (đã được thể hiện ở trên):

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/drag_and_drop_example"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintVertical_bias="0.136" tools:text="@string/drag_and_drop_example"
            android:textSize="30sp"
            android:textColor="@color/colorTitle" android:textStyle="bold" android:id="@+id/title"/>
» Tiếp: Activity trong Android
« Trước: Các thành phần (component) của Android
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!