Android Bài 15: Sử Dụng String

Posted by

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

Chào mừng các bạn đến với bài học Android thứ 15 trong chương trình học Android của Yellow Code Books.

Chúng ta đã cùng nhau xem qua cụ thể hai (thực ra là một) resource của Android rồi. Đó là:

Style
– Và Theme

Hôm nay chúng ta lại xem đến cách sử dụng một dạng resource nữa. Đó là resource string.

Thoạt nghe qua các bạn có thể nghĩ là rất dễ, vì dù sao khái niệm string cũng không cao siêu gì. Nhưng thực ra nếu hiểu đầy đủ về string thì mình nghĩ các bạn có thể làm ra được nhiều điều hay ho cho ứng dụng của các bạn nữa đấy. Hãy cùng nhau khám phá nào.

Giới Thiệu Về String Resource

String là một dạng resource khá cơ bản trong Android, chúng đơn giản chỉ là một chuỗi hoặc một danh sách nhiều chuỗi. Nhiệm vụ cơ bản của string là cung cấp text dựng sẵn cho các view, đó có thể là một nhãn của TextView, nhãn của Button, hint cho EditText,… Sở dĩ mình dùng từ text dựng sẵn, là vì đây là các text được định nghĩa trước và gán vào các view khi thiết kế, để khi người dùng mở app lên thì tất cả các text này đã được các view sử dụng đến rồi. Nhưng nếu trong quá trình sử dụng ứng dụng, người dùng thêm vào các content, như là các ghi chú, hay các nhãn cho category trong TourNote, thì đó lại là các text khác không thuộc phạm vi quản lý của resource string nhé.

Như bạn đã thực hành ở Bài 8, resource string được để trong thư mục res/values/ (hoặc res/values-xxx/ cho alternative resource), và nằm trong file strings.xml.

screen-shot-2016-10-04-at-11-41-43

Nếu click đúp vào file strings.xml này ra bạn sẽ thấy thẻ gốc cho file này (hay cho tất cả các file nào khác bên trong thư mục values/) là thẻ resources. Bên trong thẻ resources này là các thẻ string. Cụ thể các thẻ string này sẽ được định nghĩa và sử dụng như thế nào thì chúng ta cùng qua các phần ở bên dưới.

resource

Sử Dụng Plain String

Plain String, mình không biết dịch ra tiếng Việt như thế nào, nên nói tạm rằng đây là “string không có định dạng, hay không có phong cách”. Nó đơn giản là một dạng cơ bản nhất của string, các text trong plain string chỉ đơn giản là các ký tự bình thường, hoặc ký tự “\n” để tách xuống một dòng mới. Bạn sẽ làm quen với các dạng nâng cao khác của string ở các mục tiếp theo bên dưới bài học.

Khai Báo Plain String

Mỗi một plain string được khai báo trong một thẻ string (1), và được đặt cho một cái tên theo sau thuộc tính name (2). Sau cùng là nội dung của plain string đó (3).

pain_string

Truy Xuất Đến Plain String

Từ bất kỳ file XML nào, hay từ file AndroidManifest.XML, bạn có thể truy xuất đến plain string này bằng cách gọi @string/tên_string (như những gì bạn đã làm quen ở Bài 8).

Screen Shot 2017-03-28 at 16.55.29

Còn nếu từ Java source code, bạn có thể chỉ định đến tên_tring này bằng cách gọi R.string.tên_string. Chẳng hạn hàm sau sẽ set text về cho một TextView ở Java code.

// Khai báo TextView chính là TextView từ XML resource, với id đã khai báo là activity_main_tv_empty
TextView textView = (TextView) findViewById(R.id.activity_main_tv_empty);

// Set plain text cho TextView
textView.setText(R.string.empty_note);

Sử Dụng Styled String

Ngược lại với plain string chỉ giúp hiển thị các ký tự rất đỗi bình thường. Thì styled string là một loại “string có phong cách”, nó giúp bạn tạo một string trông có phần điệu nghệ hơn, như in nghiêng, in đậm, hay có thể hiển thị các ký tự đặc biệt,…

Dưới đây là các cách sử dụng từng loại styled string mà bạn nên biết.

Hiển Thị Dấu (‘), Dấu (\) Và Dấu (“)

Điều đầu tiên với plain string, là bạn không thể khai báo ba ký tự đặc biệt này được. Ví dụ khai báo string như sau sẽ bị hệ thống báo lỗi. Hoặc nếu không báo lỗi như trường hợp sử dụng dấu nháy kép ở dòng thứ ba, thì cũng sẽ không thể hiển thị dấu nháy này lên màn hình được.

Group

Khai Báo Các Dấu Đặc Biệt Này

Vậy khi bạn gặp ba ký tự đặc biệt trên, với cách giải quyết rất đơn giản, bạn hãy đặt thêm một ký tự gạch chéo ngược (\) ở trước mỗi ký tự đặc biệt này.

Group_1

Một ghi nhớ nhỏ, là với string chỉ có chứa một loại ký tự (‘), thì bạn còn có một cách khác là sử dụng dấu nháy kép bao hết string này, khi đó bạn không cần dùng đến ký tự (\) nữa.

Group_2

Truy Xuất Đến Các String Đặc Biệt Này

Chúng ta vẫn truy xuất đến các string này thông qua XML hay Java code giống như với plain string vậy.

Hiển Thị Các Ký Tự (&), (<), (>), (…)

Ngoài ba dấu đặc biệt đã nói ở trên, string XML của Android còn có các ký tự đặc biệt nữa mà bạn không thể dùng trực tiếp chúng được, bạn phải dùng code để hiển thị. Bạn xem ví dụ lỗi.

Group_3

Trường hợp dòng thứ ba, với ký tự (…) thì hệ thống không báo lỗi gì đâu, và khi run ứng dụng thì ký tự này cũng hiển thị tốt, không như trường hợp của dấu (“) trên kia. Nhưng vì hệ thống có gợi ý không nên dùng thẳng ra như vậy, nên mình liệt kê nó vào danh sách phải thay thế này.

Khai Báo Các Ký Tự Đặc Biệt Này

Vậy tóm lại là bạn phải thay chúng bằng các mã như sau (không có khoảng trắng đằng sau các ký tự & nhé).

& thay bằng & amp;
< thay bằng & lt;
> thay bằng & gt;
thay bằng & #8230;

Group_4

Truy Xuất Đến Các String Đặc Biệt Này

Cũng tương tự như plain string.

Tạo Phong Cách Bằng Thẻ HTML

Sẽ có lúc bạn rất cần đến các tùy chỉnh in nghiêng, in đậm, hay gạch chân một vài ký tự nào đó trong một item string. Vậy lúc nào cần thì bạn hãy nhớ bài học hôm nay.

Cách Tạo Phong Cách Cho String Bằng Thẻ HTML

Với sự hỗ trợ của thẻ HTML, bạn chỉ có thể định dạng được ba phong cách cho string như sau.

in đậm text
in nghiêng text
gạch chân text

Bạn có thể thử nghiệm với string empty_note của TourNote như sau.

Group_5

Truy Xuất Đến Các String Dùng Thẻ HTML Này

Nếu truy xuất đến string có dùng thẻ HTML này từ các file resource XML khác, thì bạn cứ dùng như plain string bằng cách gọi @string/tên_string.

Còn khi truy xuất từ file Java. Nếu bạn dùng hàm set text như ví dụ với plain string trên kia thì các thẻ HTML sẽ hoạt động bình thường. Nhưng nếu bạn dùng hàm này thì định dạng HTML sẽ không thấy hiển thị đâu nhé setText(getString(R.string.empty_note));, vì hàm getString() sẽ loại bỏ tất cả các thông tin liên quan đến thẻ HTML ra khỏi chuỗi mất rồi.

Bạn hãy tự thử nghiệm, thì màn hình TourNote sẽ trông như sau.

Screenshot_1491283492

Tạo Phong Cách Bằng CDATA

Với việc dùng các thẻ HTML như trên để tạo phong cách cho string, bạn chỉ có thể làm cho vài ký tự nào đó in đậm, in nghiêng, hay gạch chân. Vậy câu hỏi là với các định dạng HTML khác thì sao, khi đó CDATA là một trong những câu trả lời cho câu hỏi này.

Tạo Phong Cách Cho String Bằng CDATA

Bạn vẫn khai báo như một plain string bình thường, chỉ có khác là ở nội dung của string, bạn phải bao bọc lấy string bằng một khai báo CDATA (1), bên trong CDATA là các định dạng theo HTML mà bạn biết (2).

cdata

Truy Xuất Đến String Dùng CDATA

Bạn không thể truy xuất đến string dạng này thông qua XML. Mà phải gọi thông qua hàm Html.fromHtml(getString(R.string.example_for_cdata));. Bạn nhìn code ví dụ sau.

// Khai báo TextView chính là TextView từ XML resource, với id đã khai báo là activity_main_tv_empty
TextView textView = (TextView) findViewById(R.id.activity_main_tv_empty);

// Set text có style là CDATA cho TextView
textView.setText(Html.fromHtml(getString(R.string.example_for_cdata)));

Khi bạn chạy lại TourNote thì có thể thấy nội dung text được định dạng khá đẹp như này.

Screenshot_1491284668

Tạo Phong Cách Bằng SpannableString

Uhm, có thể có bạn không biết cách dùng thẻ HTML. Hoặc có thể bạn không thích định dạng string thông qua các thẻ HTML này. Vậy thì có một cách khác thay thế HTML hoàn hảo nhưng cũng rất mạnh mẽ, đó là SpannableString.

Cách Tạo Phong Cách Cho String Bằng SpannableString

Như bạn thấy, SpannableString là một Java class, vậy chắc chắn chúng ta phải tương tác với Java code rồi. Nhưng trước tiên bạn có thể định nghĩa một string trong XML trước cũng được. Như ví dụ mình khai báo một string sau.

Screen Shot 2017-04-04 at 16.21.10

Bạn nhớ rằng khi khai báo một string dài trong XML, việc bạn tự nhấn enter xuống hàng chỉ là để bạn quản lý nội dung string rõ ràng hơn, khi run ứng dụng, thì các enter đó sẽ không được thể hiện thành các xuống hàng thực sự, như những xuống hàng ở hình trên đây. Nếu bạn muốn xuống hàng thực sự khi run ứng dụng, thì hãy dùng ký tự “\n”, ký tự này cũng xuất hiện ở hình trên đấy nhé.

Và với SpannableString thì mình muốn đoạn XML như trên sẽ được chỉnh sửa như sau.

– String (1) sẽ có màu đỏ.
– String (2) sẽ có font lớn gấp 2 lần các string xung quanh.
– String (3) khi click vào sẽ hiển thị một thông báo dạng Toast.
– String (4) khi click vào sẽ dẫn đến trang chủ của Yellow Code Books.

spannable

Bạn tham khảo code sau.

// Khai báo TextView chính là TextView từ XML resource, với id đã khai báo là activity_main_tv_empty
TextView textView = (TextView) findViewById(R.id.activity_main_tv_empty);

// Khai báo SpannableString với text lấy từ string resource
CharSequence exampleForSpannable = getText(R.string.example_for_spannable);
SpannableString spannableString = new SpannableString(exampleForSpannable);

// Set màu đỏ cho string (1). Vị trí từ 0 đến 30
spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, 30, 0);

// Làm cho string (2) bự gấp 2 lần. Vị trí là ký tự 84
spannableString.setSpan(new RelativeSizeSpan(2), 84, 85, 0);

// Làm cho string (3) có thể click được, đồng thời có màu xanh, khi click vào hiển thị Toast. Vị trí từ 128 đến 150
ClickableSpan clickableSpan = new ClickableSpan() {
	@Override
	public void onClick(View widget) {
		Toast.makeText(MainActivity.this, "Will be implemented later...", Toast.LENGTH_SHORT).show();
	}
};
spannableString.setSpan(clickableSpan, 128, 150, 0);
spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), 128, 150, 0);

// Làm chi string (4) có thể click được, đồng thời có màu đen, bự gấp rưỡi, khi click vào thì đến link. Vị trí từ 178 đến hết string
spannableString.setSpan(new URLSpan("https://yellowcodebooks.com/"), 178, exampleForSpannable.length(), 0);
spannableString.setSpan(new ForegroundColorSpan(Color.BLACK), 178, exampleForSpannable.length(), 0);
spannableString.setSpan(new RelativeSizeSpan(1.5f), 178, exampleForSpannable.length(), 0);

// Đoạn này làm cho ClickableSpans và URLSpans có thể hoạt động
textView.setMovementMethod(LinkMovementMethod.getInstance());

// Set spannable text vào cho TextView
textView.setText(spannableString);

Để cho string hiển thị thêm đẹp hơn, thì bạn có thể kết hợp cả SpannableString lẫn các thẻ HTML như đã nói ở trên vào khai báo string nhé. Bạn hãy tự thử nghiệm xem.

Xong, chúng ta vừa kết thúc làm quen với resource kế tiếp của Android, resource kiểu string. Tuy nhiên các cách sử dụng string trên đây vẫn chưa phải là tất cả những thú vị mà Android mang lại, chúng ta vẫn còn một số cách hiển thị string nữa, như string có định dạng, string array, hay string theo số lượng sẽ được mình nói đến ở bài kế tiếp nhé.

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ẽ nói đến phần còn lại của resource dạng string, và cùng nhau thực hành tạo các string còn lại cho TourNote.

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

6 comments

  1. Ảnh nhiều khi không load đc ạ, nếu có thể thì ad thêm code giống như mấy đoạn java đc ko ạ, cảm ơn.

    1. Ồ cảm ơn bạn Nam, theo mình được biết thì với 3G của một số nhà mạng, họ chặn các trang của wordpress.com, không biết vì lí do gì. Nếu bạn Nam xem trên 3G thì nhiều khả năng sẽ không load nổi cái hình. Mình sẽ chỉnh sửa lại bài viết cho phù hợp hơn.

  2. anh ơi em có đoạn code cộng mà sao từ cộng vẫn không chịu in đạm vậy anh, có sai chỗ nào không anh

    1. Mình chưa hiểu lắm, bạn Hiếu có thể cho mình biết bạn dùng cách thức nào để in đậm text, và code của bạn như thế nào nhé, để mình dễ đoán bệnh.

Gửi phản hồi