TextView 특정문자열 색깔넣기(setSpan, html)

Posted by ITPangPang
2016. 10. 23. 03:47 안드로이드(android)/위젯(Widget)



TextView 특정문자열 색깔넣기

(setSpan, html)


ㆍ 이번글에서는 TextView 안에 있는 문자열중에

    원하는 문자열만 색깔을 넣거나 바꾸는 방법에

    대해 알아보도록 하겠습니다.


ㆍ 가장 대중적인 방법인 setSpan과 그 다음 html을

    이용하는 방법정도 써보겠습니다.



이번글에서

만들어 볼 화면입니다



일반적으로

하나의 TextView에

담겨있는 문자열은

따로따로 컨트롤

할 수 없습니다.


그러나 위에

일반적이라고 적은이유는

다른 방법을 사용하면

바꿀 수 있는 방법이

얼마든지 있습니다.


setSpan



첫번째 방법은

어느정도 많이들

알고 있는

setSpan입니다


setSpan은

SpannableStringBuilder

클래스에서 사용가능한

메서드입니다


특정 Text의

색깔, 밑줄, 링크 등

다양한 변화를

줄 수 있습니다.


이번에는 간단히

위에 결과화면대로

색깔 바꾸는 정도만

해보겠습니다.



1단계

SpannableStringBuilder

생성하고 원하는 문자열을

담는다


public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = "안녕하세요 여기라는 글자를 보라색으로 바꿔보겠습니다";
TextView tv = (TextView)findViewById(R.id.tv);
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
}
}


2단계

특정 Text를 변경시켜주기

위해서 setSpan 처리를 한다

(블럭정도 잡는다 생각)

ssb.setSpan


색깔을 바꿔주기 위해서

ForegroundColorSpan

사용한다

ssb.setSpan(new ForegroundcolorSpan(~


원하는 색깔과

위치를 잡아주면 완료!

public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = "안녕하세요 여기라는 글자를 보라색으로 바꿔보겠습니다";
TextView tv = (TextView)findViewById(R.id.tv);
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
ssb.setSpan(new ForegroundColorSpan(Color.parseColor("#5F00FF")), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssb);
}
}

결과는 위와 같습니다

그래도 한번 색깔만

다른걸로 변경해보자면



언젠가 한번 쓸 지도 모르지만

다른 효과를 내기 위해서는


ForegroundColorSpan 대신

ClickableSpan, AbsoluteSizeSpan

등을 써주시면 됩니다!


HTML


.....

일단 HTML은

말 그대로 


HTML 태그를

사용하는 방법입니다.


처음에 이걸 알았을때

머릿속으로 엄청나게

신기하면서도 많은걸

해봐야지 생각했지만..


조금 사용하다보니

기대했던것보다는 실망?

했던...


왜냐하면 모든 태그를

지원하지 않고

기본적인 태그만 제공됩니다


제 기억에 문서를 봤을때

Not all HTML tags

라는 글씨가.. 지워지지

않는군요..


하지만

이번글에서는

글자색이라는


HTML에서 보면

아주 아주 아주

기초적인 부분이죠


말이 너무 길었네요..

처음 사용하던때가 생각나서.


바로 사용방법을

알아보면


일단 간단합니다

TextView.setText안에

Html.fromHtml이라고

적으면 됩니다.


그 후에

"<tag>안뇽</tag>"

이런식으로 넣으면

전부 적용됩니다


맨 위

결과화면을

만들기 위해서는

방법이 여러가지 있겠지만


위에서처럼 Text를 어디서

받아오는게 아니라고 가정한다면

public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String strFront = "안녕하세요 ";
String strChange = "<font color=\"#5F00FF\">여기라는</font>";
String strBack = " 글자를 보라색으로 바꿔보겠습니다";
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(Html.fromHtml(strFront + strChange + strBack));
}
}


이렇게 원하는 부분만

HTML 태그를 이용해서

바꿔줄 수 있습니다.


상황이 어떻게

될 지 모르나

String 처리 메서드를

사용해서 나타내도 됩니다.

public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = "안녕하세요 여기라는 글자를 보라색으로 바꿔보겠습니다";
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(Html.fromHtml(str.substring(0,6)
+ "<font color=\"#5F00FF\">"
+ str.substring(str.indexOf("여기라는"),str.indexOf("여기라는")
+"여기라는".length())+"</font>"
+ str.substring(str.indexOf(" 글자를 보라색으로 바꿔보겠습니다"))));
}
}


위치를 찾아서

3군대로 나눠서 찍어줬습니다

(어쨋든 위랑 똑같음..)


끝!