2011-08-28 8 views
67

TextView에있는 한 단어의 텍스트 색상을 Activity에서 변경하는 방법을 찾고 있습니다. 이와 예를 들어 TextView에서 한 단어의 텍스트 색상 변경

는 :

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

어떻게 빨간색으로 next 텍스트의 색상을 바꿀 것?

+1

[? 것이 가능 텍스트 뷰 내부에 여러 스타일을 가지고있다]의 사용 가능한 복제 (http://stackoverflow.com/questions/1529068/is-it- 여러 가지 스타일이 있음 - 텍스트보기 내에서) – blahdiblah

+0

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

답변

130

내가 아는 가장 쉬운 방법은 html을 사용하는 것입니다.

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

하지만 번거 로움을 일으킬 수있는 색상을 변경하려면 (경우?) 때의 텍스트 뷰를 다시 요구합니다.

+1

분명히 가장 간단한 방법이지만 색상은 color = '# EE0000'이 아니어야 파운드 기호가 16 진수를 나타내는 데 필요합니다. – Tom

+0

고침, 고마워! 이 코드를 실제 코드 나 메모리에서 색상 생성기 웹 사이트로 복사하면 이전에 작동하지 않았을 수도 있습니다. – Dan

+0

확인 만하면됩니다. 또한, 내가 알기로 8 자리 16 진수 코드를 사용할 수 없으므로 알파 성분이 없습니다. 그 하나가 잠시 나를 곤란하게 만들었습니다. – 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); 

당신은 또한 당신이 텍스트의 크기를 증가 할 수 있습니다 그것을 굵은 글씨 등을 만들 .... 심지어 일부 이미지에 넣어,이 것 spannable 사용해야합니다.

+4

좋은 대답, 고마워. 이 경우 "start + next.length()"대신 "s.length()"를 사용할 수 있습니다. int end = s.length(); – Oleg

+1

Xamarin.Android Solution을 찾는 분에게. 컨트롤의'TextFormatted' 속성을 사용하여'SpannableString' 객체를 할당 할 수 있습니다. – CodeIt

+0

이 작업을 수행하지 못했습니다.B K의 솔루션으로 끝났습니다. –

2

당신은 TextView 텍스트 (대소 문자 구분) 내부에 특정 String의 모든 인스턴스의 상태를 변경할 수는 StringBuilder의이 같은 SpannableString 사용하려면 다음

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); 

}

  • 전체 TextView 텍스트를 StringBuilder 안에 저장하십시오.
  • 검색된 문자열을 StringBuilder 안에 저장하십시오.
  • 스토어는 SpannableString
  • 내부의 wholre TextView 텍스트는 간단한 작업이 TextView 텍스트 안에 모든 String 인스턴스를 찾을 수에 도달 할 때를 변경합니다.
  • TextView의 텍스트 값을 SpannableString으로 설정하십시오. 이 같은
15

사용 SpannableStringBuilder :

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

'새로운 ForegroundColorSpan (Color)'대신 텍스트를 원래의 기본 색으로 유지할 수있는 무언가가 있습니까? – cjnash