Wednesday, October 4, 2017

Tô màu chữ trong Android

Để tô màu chữ, ta có thể làm trong file xml.
android:textColor="#00F"
Cũng có thể làm trong code.
TextView.setTextColor(Color.parseColor("#800080"));
Tuy nhiên, nếu ta muốn tô màu cùng một đoạn chữ nhưng có các màu khác nhau, ta phải dùng lớp SpannableString.
Giả sử ta muốn từng đoạn trong một chuỗi có màu khác nhau, ta làm như sau.
String vao="Đây là dòng chữ có nhiều màu";
SpannableString s = new SpannableString(vao);
s.setSpan(new ForegroundColorSpan(Color.RED), 0, 8, 0);
s.setSpan(new ForegroundColorSpan(Color.parseColor("#008000")), 8, 15, 0);
s.setSpan(new ForegroundColorSpan(Color.parseColor("#0000ff")), 16, 27, 0);
tv.setText(s);

Các ký tự sẽ tùy theo vị trí ta đã đặt.
Tiếp theo, ta có một chuỗi có nhiều dòng, ta muốn mỗi dòng có một màu. Thông thường ta phải set mỗi dòng vào 1 textView rồi tô màu riêng của textView đó. Nhưng với lớp SpannableStringBuilder ta có thể làm ngay trong một textView.
Giả sử chuỗi của ta có 7 dòng từ Thứ Hai đến Chủ Nhật, ta muốn set mỗi dòng một màu, chỉ trong 1 textView duy nhất.
Ta sẽ hai báo một mảng arraylist.
ArrayList<String> ar = new ArrayList<String>();
Thêm các thứ vào mảng.

Dùng lệnh for duyệt mảng để set màu cho từng dòng.
SpannableString s1 = new SpannableString("\n");
          SpannableStringBuilder builder = new SpannableStringBuilder();
for (int i = 0; i < ar.size(); i++) {
     if (ar.get(i).equals("Thứ Hai")) {
SpannableString redSpannable = new SpannableString(ar.get(i));
                   redSpannable.setSpan(new ForegroundColorSpan(Color.parseColor("#FF7F50")), 0, ar
                             .get(i).length(), 0);
              builder.append(redSpannable);
              builder.append(s1);              
} else if (ar.get(i).equals("Thứ Ba")) {
SpannableString redSpannable = new SpannableString(ar.get(i));
                   redSpannable.setSpan(new ForegroundColorSpan(Color.parseColor("#0000ff")),
                             0, ar.get(i).length(), 0);
                   builder.append(redSpannable);
                   builder.append(s1);
} else if (ar.get(i).equals("Thứ Tư")) {
SpannableString redSpannable = new SpannableString(ar.get(i));
                   redSpannable.setSpan(new ForegroundColorSpan(Color.parseColor("#ff008000")),
                             0, ar.get(i).length(), 0);
                   builder.append(redSpannable);
                   builder.append(s1);
} else if (ar.get(i).equals("Thứ Năm")) {SpannableString redSpannable = new SpannableString(ar.get(i));
                   redSpannable.setSpan(new ForegroundColorSpan(Color.parseColor("#800000")),
                             0, ar.get(i).length(), 0);
          builder.append(redSpannable);
          builder.append(s1);
     } else if (ar.get(i).equals("Thứ Sáu")) {
                   SpannableString redSpannable = new SpannableString(ar.get(i));
redSpannable.setSpan(new ForegroundColorSpan(Color.parseColor("#00FF00")),
                             0, ar.get(i).length(), 0);
     builder.append(redSpannable);
     builder.append(s1);
     }
     else if (ar.get(i).equals("Thứ Bảy")) {
SpannableString redSpannable = new SpannableString(ar.get(i));
     redSpannable.setSpan(new ForegroundColorSpan(Color.parseColor("#FF00FF")),
                             0, ar.get(i).length(), 0);
          builder.append(redSpannable);
          builder.append(s1);
     }
else {
SpannableString redSpannable = new SpannableString(ar.get(i));
                   redSpannable.setSpan(new ForegroundColorSpan(Color.RED), 0, ar
                             .get(i).length(), 0);
     builder.append(redSpannable);
     builder.append(s1);
}
}
     builder.delete(builder.length() - 1, builder.length());
     tv2.setText(builder);
Kết quả chạy ra như sau.


No comments:

Post a Comment