2011-08-28 81 views
67

Tôi đang tìm cách thay đổi màu của văn bản của một từ trong một số TextView từ trong một Activity.Thay đổi màu chữ của một từ trong một TextView

Ví dụ, với điều này:

String first = "This word is "; 
String next = "red" 
TextView t = (TextView) findViewById(R.id.textbox); 
t.setText(first + next); 

Làm thế nào tôi có thể thay đổi màu sắc của next văn bản sang màu đỏ?

+1

có thể trùng lặp của [? Có thể có nhiều phong cách bên trong một TextView] (http://stackoverflow.com/questions/1529068/is-it- có thể-to-có-nhiều kiểu-bên trong-một-văn bản xem) – blahdiblah

+0

http://stackoverflow.com/questions/9754076/which-html-tags-are-supported-by-android-textview/35271588#35271588 –

Trả lời

130

Cách dễ nhất tôi biết là chỉ cần sử dụng html.

String first = "This word is "; 
String next = "<font color='#EE0000'>red</font>"; 
t.setText(Html.fromHtml(first + next)); 

Nhưng điều này sẽ yêu cầu bạn phải tạo lại TextView khi (nếu?) Bạn muốn thay đổi màu, điều này có thể gây rắc rối.

+1

Điều này chắc chắn là cách đơn giản nhất nhưng không nên là màu sắc = '# EE0000' biểu tượng bảng Anh là cần thiết để biểu thị một màu thập lục phân. – Tom

+0

Cố định, cảm ơn! Tôi không nhớ nếu tôi sao chép từ mã thực tế hoặc từ bộ nhớ với một trang web máy phát màu để nó có thể không hoạt động trước đây. – Dan

+0

Ok chỉ cần đảm bảo! Ngoài ra, như tôi phát hiện ra bạn không thể sử dụng mã hex 8 chữ số để không có thành phần alpha. Đó là một trong những stumped tôi cho một thời điểm. – Tom

62
t.setText(first + next, BufferType.SPANNABLE); 
Spannable s = (Spannable)t.getText(); 
int start = first.length(); 
int end = start + next.length(); 
s.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

bạn phải sử dụng spannable điều này cũng sẽ cho phép bạn tăng kích thước của một số văn bản, làm cho nó đậm vv .... thậm chí đưa vào một số hình ảnh.

+4

Câu trả lời hay, cảm ơn. Trong trường hợp này "s.length()" có thể được sử dụng thay cho "start + next.length()": int end = s.length(); – Oleg

+1

Trong trường hợp bất kỳ ai tìm kiếm Giải pháp Xamarin.Android. Bạn có thể gán đối tượng 'SpannableString' bằng cách sử dụng thuộc tính' TextFormatted' của điều khiển của bạn. – CodeIt

+0

Không thể làm việc này.Kết thúc với giải pháp của B K. –

2

Nếu bạn muốn thay đổi trạng thái của tất cả các trường hợp của một cụ String bên trong một TextView văn bản (trường hợp không nhạy cảm), bạn có thể sử dụng StringBuilder s và SpannableString như thế này:

StringBuilder textBuilder = new StringBuilder(myTextView.getText().toString()); 
StringBuilder searchedTextBuilder = new StringBuilder((mySearchedString)); 
SpannableString spannableString = new SpannableString(myTextView.getText().toString()); 

int counter = 0; 
int index = 0; 

for (int i = 0;i < textBuilder.length() - mySearchedString.length() - 1;i++) 
{ 
    counter = 0; 
    if (Character.toLowerCase(textBuilder.charAt(i)) == Character.toLowerCase(searchedTextBuilder.charAt(index))) 
    { 
     counter++; 
     index++; 
     for (int j = 1,z = i + 1;j < mySearchedString.length() - 1;j++,z++) 
     { 
      if (Character.toLowerCase(textBuilder .charAt(z)) == Character.toLowerCase(searchedTextBuilder .charAt(index))) 
      { 
       counter++; 
       index++; 
      } 
      else 
      { 
       index++; 
       if (index % mySearchedString.length() == 0) 
       { 
        index = 0; 
       } 
       break; 
      } 
     } 
     if (counter == mySearchedString.length() - 1) // A match 
     { 
      spannableString.setSpan(new ForegroundColorSpan(Color.RED), i, 
           i + mySearchedString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Do the change you want(In this case changing the fore ground color to red) 
      index = 0; 
      continue; 
     } 
     else 
     { 
      index = 0; 
      continue; 
     } 
    } 
} 
myTextView.setText(spannableString); 

}

  • Lưu toàn bộ văn bản TextView bên trong một số StringBuilder.
  • Lưu chuỗi tìm kiếm bên trong một StringBuilder.
  • Store TextView văn bản wholre bên trong một SpannableString
  • Thực hiện một thao tác đơn giản để tìm tất cả các String trường bên trong văn bản TextView và thay đổi chúng khi đạt được.
  • Đặt giá trị văn bản của TextView thành SpannableString.
15

Sử dụng SpannableStringBuilder như thế này:

SpannableStringBuilder builder = new SpannableStringBuilder(); 

SpannableString str1= new SpannableString("Text1"); 
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0); 
builder.append(str1); 

SpannableString str2= new SpannableString(appMode.toString()); 
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0); 
builder.append(str2); 

TextView tv = (TextView) view.findViewById(android.R.id.text1); 
tv.setText(builder, TextView.BufferType.SPANNABLE); 
+0

Có điều gì tôi có thể thay thế 'ForegroundColorSpan (Color) 'mới để làm cho văn bản giữ lại màu mặc định ban đầu của nó? – cjnash

Các vấn đề liên quan