Android Bài 19: Sử Dụng Các Resource Values Khác

Posted by

Được chỉnh sửa ngày 25/6/2017.

Chào mừng các bạn đến với bài học thứ 19 trong chuỗi bài học về lập trình ứng dụng Android của Yellow Code Books.

Như vậy là sau một vài cân nhắc, mình quyết định bài học Android hôm nay sẽ dành để nói đến các dạng resource còn lại được hỗ trợ trong thư mục res/values/. Bạn nhớ là trong res/values/ thôi nhé, có nghĩa là phía trước còn rất nhiều resource thú vị khác, nhưng chúng không được tổ chức bên trong thư mục này.

Bạn cũng biết rằng Android hỗ trợ rất nhiều dạng resource khác nhau cho chúng ta vận dụng vào việc tạo một project hoàn chỉnh. Tuy nhiên như ở bài học số 8 mình có nói là mỗi một thư mục được dựng sẵn bên trong res/ của Android sẽ có tác dụng hỗ trợ một loại resource nhất định. Và resource ở các bài học gần đây mà chúng ta từng làm quen vẫn chưa ra khỏi một thư mục – res/values/.

Điểm Lại Thư Mục res/values/

Trong thư mục res/values/ mà chúng ta đã trải qua, có các kiểu resource, mà như bạn đã làm quen, mỗi kiểu như vậy được đặt trong một file .xml nhất định, mình sẽ giúp bạn ôn lại bằng danh sách sau.

Resource Style – Để trong res/values/styles.xml
Resource Theme (thực chất cũng là Style) – Để trong res/values/styles.xml
Resource String – Để trong res/values/strings.xml
Resource Color – Để trong res/values/colors.xml
Resource Dimen – Để trong res/values/dimens.xml
Resource Bool – Bài hôm nay sẽ nói đến
Resource ID – Bài hôm nay sẽ nói đến
Resource Integer – Bài hôm nay sẽ nói đến
Resource Integer Array – Bài hôm nay sẽ nói đến
Resource Typed Array – Bài hôm nay sẽ nói đến

Bạn cũng nên biết là các resource trong res/values/ mà mình đã nói ở các bài trước khá là quan trọng, bởi vì tần suất sử dụng của chúng trong project của bạn là khá cao, thậm chí một loại resource nào đó, như một color chẳng hạn, sẽ được rất nhiều nguồn khác truy cập đến, nên việc bạn tổ chức như những gì mình thực hiện là khá hữu ích, trong trường hợp nào đó bạn chỉ cần vào resource loại này và thay đổi chúng, lập tức cả project sẽ thay đổi theo, không mất nhiều thời gian đúng không nào.

Tuy nhiên các resource còn lại của res/values/ mà chúng ta làm quen hôm nay, thì lại ít quan trọng hơn, bạn có thể không cần định nghĩa chúng cũng được, vì chúng ngược lại với những ý mình nói ở ngay trên đây.

Nói Thêm: Tên File Của Các Resource Bên Trong res/values/ Có Quan Trọng Không?

Có một điều mình chưa nói ở các bài trước. Rằng với các resource trong thư mục res/values/ này, liệu chúng có cần phải nằm trong đúng tên file mà chúng ta từng điểm qua hay không? Chẳng hạn như String có phải bắt buộc nằm trong strings.xml? Hay Color có bắt buộc nằm trong colors.xml? String để vào file colors.xml được không? Hoặc String để trong file với tên tùy ý, như string_cua_tao.xml có được không?

Câu trả lời là: riêng các resource bên trong thư mục res/values/ này thôi nhé, khi truy xuất đến chúng, chúng ta không cần quan tâm đến tên file chứa chúng, mà chỉ cần quan tên đến loại thẻ và tên của thuộc tính name của thẻ đó. Chẳng hạn với resource dimen, bạn chỉ cần gọi @dimen/tên_dimen hay R.dimen.tên_dimen. Và bởi vì không quan tân đến tên file chứa chúng, nên bạn có thể đặt tùm lum tá lả các resource res/values/ này ở bất kỳ file nào đều được cả.

Ví dụ sau mình làm chơi với các resource của TourNote cho vui thôi, mình trộn resource color và string lại rồi để trong một file strings_colors.xml. Tuy là làm được, nhưng mình khuyến khích các bạn đừng nên thử ở nhà nhé 😀

Screen Shot 2017-05-24 at 18.46.08

Nội dung của strings_colors.xml lai căng hỗn tạp đây.

<resources>

    <!-- Color resources -->
    <color name="colorPrimary">#00BCD4</color>
    <color name="colorPrimaryDark">#0097A7</color>
    <color name="colorAccent">#FFEB3B</color>

    <!-- String resources -->
    <string name="app_name">TourNote</string>
    <string name="common_action_close">Close</string>
    <string name="common_action_save">Save</string>
    <string name="menu_item_about_app">About App</string>
    <string name="menu_item_help">Help</string>
    <string name="menu_item_version_app">Version %s</string>
    <string name="mainscreen_add_catergory">Add Category</string>
    <string name="mainscreen_add_note">Add Note</string>
    <string name="mainscreen_edit_note">Edit Note</string>
    <string name="mainscreen_empty_note">Your note list is empty, let start to create your first note now</string>
    <string name="note_detail_share">Share</string>
    <string name="note_detail_delete">Delete</string>
    <string name="note_detail_category">Category</string>
    <string name="note_detail_note_detail">Detail</string>
    <string name="note_detail_other_information">Other Information</string>
    <string name="note_detail_map_location">Map Location</string>
    <string name="note_detail_note_name_hint">Name</string>
    <string name="note_detail_note_detail_hint">Description</string>
    <string name="note_detail_add_note_hint">Your Note (Can Add Later)</string>
    <string name="note_detail_address_hint">Address</string>
</resources>

Sử Dụng Bool

Chúng ta bắt đầu với loại resource thứ nhất trong bài hôm nay. Resource bool này giúp bạn định nghĩa ra các giá trị boolean để dùng trong project.

Như đã nói ở trên, bạn có thể tạo ra một file .xml bất kỳ trong thư mục res/values/ để chứa các giá trị của loại resource này. Hoặc bạn có thể để chung chúng với các file .xml có sẵn khác bên trong res/values/.

Khai Báo Bool

Resource bool lần này nằm trong thẻ bool, mỗi thẻ bool sẽ có một tên được để trong thuộc tính name, và giá trị của thẻ này chỉ có thể là true hoặc false mà thôi.

Mình ví dụ khai báo một cờ để mà ẩn/hiện TextView ở màn hình chính. Ví dụ này có tính ứng dụng thực tế đấy nhé, bạn có thể chỉ định một cờ như thế này trong resource bool, để rồi tùy thời điểm bạn sẽ quyết định đến logic của ứng dụng thông qua việc điều chỉnh các cờ này.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="enable_empty_text_display">true</bool>
</resources>

Truy Xuất Đến Bool

Nếu từ bất kỳ file XML nào, bạn có thể truy xuất đến các giá trị bool bằng cách gọi @bool/tên_bool.

Còn từ Java code, bạn có thể gọi đến thông qua R.bool.tên_bool. Như ví dụ sau. Trong ví dụ thì hàm setVisibility() của một view sẽ giúp xác định trạng thái hiển thị của view đó, chẳng hạn với tham số truyền vào hàm này là view.VISIBLE sẽ hiển thị view lên màn hình, còn view.GONE sẽ làm mất view đó đi.

TextView tvEmpty = (TextView) findViewById(R.id.activity_main_tv_empty);

boolean enableDisplay = getResources().getBoolean(R.bool.enable_empty_text_display);
if (enableDisplay) {
    tvEmpty.setVisibility(View.VISIBLE);
} else {
    tvEmpty.setVisibility(View.GONE);
}

Sử Dụng ID

Mình thấy ít ai sử dụng loại resource này. Nó giúp bạn tạo trước các ID bên trong resource XML, rồi ở nơi nào đó sẽ dùng đến các ID này. Mình thì mình không thích cách sử dụng ID kiểu này lắm, cần thì khai báo, chứ không khai báo trước ở chỗ nào đó. Nhưng vẫn viết ra cho các bạn tham khảo, ai có kinh nghiệm dùng resource ID kiểu này thì để lại comment cho mình biết nha.

Và cũng như các resource khác bên trong res/values/, bạn có thể tạo resource dạng này ở một file .xml riêng biệt hoặc để cùng với các .xml khác cũng được.

Khai Báo ID

Để tạo ra các ID bên trong file resource, bạn khai báo thẻ item. Mỗi thẻ item bạn phải chỉ định hai thuộc tính, thứ nhất type=”id” là bắt buộc, sau đó tên của ID sẽ để trong thẻ name. Thẻ item cho ID này không chứa giá trị.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="examle_id"/>
</resources>

Sử Dụng Đến ID

Nếu bạn dùng đến resource ID này để dùng vào việc khai báo một ID cho một view nào đó, bạn dùng như sau. Bạn có thể thấy rằng bởi vì ID đã được tạo trước rồi, nên thay vì khai báo ID cho TextView bằng @+id/tên_ID_mới như các bài học trước bạn đã làm quen, thì lần này bạn chỉ cần chỉ định đến ID đã khai báo mà không có dấu cộng như sau @id/tên_ID_đã_khai_báo.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.yellowcode.tournote.MainActivity">

    <TextView
        android:id="@id/examle_id"
        style="@style/InformationTextView"
        android:layout_centerInParent="true"
        android:text="@string/mainscreen_empty_note" />

    <ImageView
        android:layout_width="@dimen/empty_icon_width"
        android:layout_height="@dimen/empty_icon_height"
        android:layout_below="@id/examle_id"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/padding_medium"
        android:scaleType="fitCenter"
        android:src="@drawable/empty_note" />

</RelativeLayout>

Bạn có thể thấy ở ví dụ trên, cách khai báo ID mới cho view bằng việc chỉ định lại một ID đã được khai báo làm mình không thích, trông nó chẳng rõ ràng gì cả.

Sử Dụng Integer

Sử dụng resource dạng này nếu bạn muốn định nghĩa ra các giá trị int vào cùng một file resource. Nếu như cách sử dụng dimen hôm trước bạn buộc phải định nghĩa đơn vị kèm theo các con số, thì với integer hôm nay bạn chỉ cần định nghĩa một con số nguyên mà thôi.

Và cũng như các resource khác bên trong res/values/, bạn có thể tạo resource dạng này ở một file .xml riêng biệt hoặc để cùng với các .xml khác cũng được.

Khai Báo Integer

Resource integer này nằm trong thẻ integer, mỗi thẻ integer sẽ cần một tên trong name để bạn truy xuất đến, và giá trị của thẻ này chỉ có thể là một số nguyên.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="maxline_textview_info">5</integer>
</resources>

Sử Dụng Đến Integer

Truy xuất từ XML thì gọi @integer/tên_integer.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.yellowcode.tournote.MainActivity">

    <TextView
        android:id="@+id/activity_main_tv_empty"
        style="@style/InformationTextView"
        android:layout_centerInParent="true"
        android:text="@string/mainscreen_empty_note"
        android:maxLines="@integer/maxline_textview_info"/>

    <ImageView
        android:layout_width="@dimen/empty_icon_width"
        android:layout_height="@dimen/empty_icon_height"
        android:layout_below="@id/activity_main_tv_empty"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/padding_medium"
        android:scaleType="fitCenter"
        android:src="@drawable/empty_note" />

</RelativeLayout>

Truy xuất từ Java code thì gọi R.integer.tên_integer.

TextView tvEmpty = (TextView) findViewById(R.id.activity_main_tv_empty);

int maxLine = getResources().getInteger(R.integer.maxline_textview_info);
tvEmpty.setMaxLines(maxLine);

Sử Dụng Integer Array

Resource dạng này cho phép bạn khai báo một mảng các int. Cách khai báo và sử dụng của integer array cũng khá giống với string array vậy.

Và cũng như các resource khác bên trong res/values/, bạn có thể tạo resource dạng này ở một file .xml riêng biệt hoặc để cùng với các .xml khác cũng được.

Khai Báo Integer Array

Gần gần giống với string array, integer array dùng thẻ integerarray. Tên cho thẻ này vẫn được để trong thuộc tính name. Từng phần tử mảng sẽ được định nghĩa ở mỗi thẻ item, mỗi thẻ item như vậy chứa một con số nguyên.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer-array name="integer_array_sample">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
    </integer-array>
</resources>

Sử Dụng Đến Integer Array

Và cũng như string array, integer array chỉ được dùng đến Java code, khi đó bạn gọi đến thông qua R.array.tên_integer_array.

int[] intArrayDemo = getResources().getIntArray(R.array.integer_array_sample);

Sử Dụng Typed Array

Nên hiểu đây là resource mà bạn có thể định nghĩa mảng các kiểu dữ liệu gì cũng được. Đó có thể là mảng các string, mảng các integer, hay mảng các color, mảng các drawable,… Vấn đề còn lại của bạn là khi sử dụng chúng (mảng các xx) ở Java code, bạn phải biết chúng là kiểu dữ liệu nào để gọi cho đúng hàm mà thôi.

Và cũng như các resource khác bên trong res/values/, bạn có thể tạo resource dạng này ở một file .xml riêng biệt hoặc để cùng với các .xml khác cũng được.

Khai Báo Typed Array

Typed array không dùng thẻ string-array hay integer-array để định nghĩa, mà chỉ dùng thẻ array. Mỗi array sẽ vẫn có một tên ở thuộc tính name để gọi đến. Từng phần tử mảng sẽ được định nghĩa ở mỗi thẻ item, mỗi thẻ item như vậy chứa một loại resource tùy ý.

Như bạn thấy ví dụ sau mình định nghĩa ba loại mảng khác nhau cho ba loại resource.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <array name="array_of_string_sample">
        <item>Hello</item>
        <item>Yellow</item>
        <item>Code</item>
        <item>Books</item>
    </array>

    <array name="array_of_int_sample">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
    </array>

    <array name="array_of_color_sample">
        <item>#FF0000</item>
        <item>#00FF00</item>
        <item>#0000FF</item>
    </array>

</resources>

Sử Dụng Đến Types Array

Cũng như bao array khác, chỉ được dùng đến ở Java code. Khi đó tùy vào mảng có kiểu resource gì mà bạn hãy gọi đến hàm tương ứng, như ví dụ sau.

// Array of strings, sử dụng như resource string array
String[] strings = getResources().getStringArray(R.array.array_of_string_sample);
// Array of integers. sử dụng như resource integer array
int[] ints = getResources().getIntArray(R.array.array_of_int_sample);
// Array of color, cần đến TypedArray để lấy ra resource tương ứng
TypedArray colors = getResources().obtainTypedArray(R.array.array_of_color_sample);
int color = colors.getColor(0, 0);

Trên đây là tất cả các loại resource được tổ chức bên trong thư mục res/values/ của Android. Có một điểm chung nhất là, các resource bên trong thư mục này đều có thẻ gốc là thẻ resources. Chính điểm chung này giúp cho các loại resource này được để ở bất kỳ file .xml nào bên trong res/values/ đều được như mình có nói nhiều ở trên, miễn là thẻ gốc của tất cả các file đều là thẻ resources.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy đánh giá 5 sao nếu thấy thích bài viết, hãy comment bên dưới nếu có thắc mắc, hãy để lại địa chỉ email của bạn để nhận được thông báo mới nhất khi có bài viết mới, và nhớ chia sẻ các bài viết của Yellow Code Books đến nhiều người khác nữa nhé.

Bài Kế Tiếp

Chúng ta sẽ bắt đầu làm quen với một dạng resource khá là “quyền lực” trong lập trình Android, đó là resource drawable, bài học tiếp theo sẽ mở đầu cho tất cả các cách sử dụng đến dạng resource này trong Android.

Advertisements
Rating: 5.0/5. From 8 votes.
Please wait...

2 comments

Gửi phản hồi