개발새발 - IT 기술블로그
article thumbnail

 

안녕하세요. 이번 포스팅은 하나의 문자열에서 글자의 자릿수마다 다른 설정을 줄 수 있는 Spannable String에 대해서 알아보겠습니다.

 

Spannable String은 안드로이드 프레임워크 내부에서 제공하는 기능이며, 사용방법이 굉장히 다양하기 때문에 이번 예제에서는 자주 사용되는 몇가지만 다뤄보도록 하겠습니다. 

 

 

결과 코드👀

아래 코드는 spannable string이라는 하나의 문자열의 한 부분을 수정한 코드입니다.

TextView textView = findViewById(R.id.textView);

SpannableStringBuilder span = new SpannableStringBuilder("spannable string");

span.setSpan(new android.text.style.UnderlineSpan(),
               0,
               9,
               Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

span.insert(12,"***");

textView.setText(span);

 


예제 진행

 

뷰 생성

 

먼저, 연습에 사용 할 텍스트뷰를 하나 만들어보겠습니다. 프로젝트를 생성하면 기본으로 만들어지는 텍스트뷰에 아이디를 부여 해 사용하겠습니다.

 

 

SpannableStringBuilder 생성

 

Builder의 생성 방식은 총 3가지가 있는데 사용방식의 차이가 있을 뿐 같은 의미입니다. 세번째 방법은 설정할 문자열의 인덱스를 먼저 선언하는 방식이네요. 이번 예제는 두번째 방식으로 진행하겠습니다.

//1번방식
SpannableStringBuilder span1 = new SpannableStringBuilder();
span1.append("spannable string");

//2번방식
SpannableStringBuilder span2 = new SpannableStringBuilder("spannable string");

//3번방식
SpannableStringBuilder span3 = new SpannableStringBuilder("spannable string", 0, 9);

 

 

setSpan()

 

준비가 끝났으면 마지막으로 가장 핵심인 텍스트를 수정해보겠습니다.

setSpan(Object _what_, int _start_, int _end_, int _flags_)

 

 

setSpan 메서드는 총 4가지의 매개변수를 인수로 갖는데,

'what'은 텍스트에 적용할 스팬을

'start'는 시작 문자열 인덱스를

'end'는 종료 문자열 인덱스를(end 인덱스 전까지 해당. substring과 유사)

'flags'는 매개변수가 스팬이 확장되어 삽입된 텍스트를 포함해야 하는지를 판단합니다. 

 

 

what

종류는 공식문서를 참고하거나 android.text.style.을 입력하면 적용 가능한 매개변수를 확인하실 수 있습니다.

 

 

flag

Spannable.SPAN_EXCLUSIVE_INCLUSIVE플래그를 사용하여 삽입된 텍스트를 포함하고

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 를 사용하여 삽입된 텍스트를 제외합니다.

 

 

 

 UnderlineSpan()

 

문자 아래에 밑줄을 긋는 방법입니다. 문자 가운데에 줄을 긋고 싶다면 StrikethroughtSapn()을 사용하세요.

 

 

모바일 용 코드 스니펫

더보기
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView = findViewById(R.id.textView);

    SpannableStringBuilder span = new SpannableStringBuilder("spannable string");

    span.setSpan(new android.text.style.UnderlineSpan(),
        0,
        9,
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    textView.setText(span);
}

 

 

 

 ForegroundColorSpan(Color int)

 

문자열의 foreground 색상을 바꾸는 방법입니다. background도 존재합니다.

 

 

모바일 용 코드 스니펫

더보기
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView = findViewById(R.id.textView);

    SpannableStringBuilder span = new SpannableStringBuilder("spannable string");

    span.setSpan(new android.text.style.ForegroundColorSpan(Color.RED),
            0,
            9,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    textView.setText(span);
}

 

 

 

 

RelativeSizeSpan(float proportion)

 

문자의 크기를 조정하는 방법입니다. 고정크기를 넣고 싶으면 AbsoluteSizeSpan을 사용하세요.

 

 

모바일용 코드 스니펫

더보기
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView = findViewById(R.id.textView);

    SpannableStringBuilder span = new SpannableStringBuilder("spannable string");

    span.setSpan(new android.text.style.AbsoluteSizeSpan(1.5f),
            0,
            9,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    textView.setText(span);
}

 

 

 

URLSpan(String url)

 

문자열에 하이퍼링크를 거는 방법입니다. "url" 대신 "도메인주소"를 넣으면 클릭 했을 시 이동합니다.

 

 

모바일용 코드 스니펫

더보기
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView = findViewById(R.id.textView);

    SpannableStringBuilder span = new SpannableStringBuilder("spannable string");

    span.setSpan(new android.text.style.URLSpan("url"),
            0,
            9,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    textView.setText(span);
    
    textView.linksClickable = true
    textView.movementMethod = LinkMovementMethod.getInstance()
}

※ 2023-08-21 추가 : 링크를 클릭할 수 있는 설정을 추가해주어야 합니다. 아래 두 라인을 추가적으로 작성해주세요

    textView.linksClickable = true
    textView.movementMethod = LinkMovementMethod.getInstance()

 

 

insert()

 

문자열 원하는 곳에 원하는 문자를 넣고싶을 때 사용합니다. 저는 12번째 인덱스에 ***라는 문자를 넣어봤습니다.

 

 

모바일용 코드 스니펫

더보기
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView = findViewById(R.id.textView);

    SpannableStringBuilder span = new SpannableStringBuilder("spannable string");

    span.setSpan(new android.text.style.URLSpan("url"),
            0,
            9,
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    span.insert(12,"***");

    textView.setText(span);
}

 

이렇게 SpannableString을 사용하는 방법에 대해 알아보았습니다.

 

하나의 텍스트에 강조 및 변형 혹은 기능을 부분별로 넣어주고 싶을 때 사용하면 유용할 것 같습니다. 

 

감사합니다.

 

 

참고

https://developer.android.com/guide/topics/text/spans?hl=ko#java 

 

스팬  |  Android 개발자  |  Android Developers

스팬 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 스팬은 강력한 마크업 객체로 문자나 단락 수준에서 텍스트 스타일을 지정하는 데 사용할 수 있습니다.

developer.android.com

 

 

 

예제 소스

https://github.com/tekken5953/SpannableStringExam

 

GitHub - tekken5953/SpannableStringExam

Contribute to tekken5953/SpannableStringExam development by creating an account on GitHub.

github.com