개발일지

Android in A..Z - Span 본문

Android (안드로이드)

Android in A..Z - Span

강태종 2021. 9. 16. 10:16

Span

Span은 TextView에 텍스트를 표현할 때 스타일을 입힐 수 있도록 도와줍니다. 예를 들면 색상, 크기, 폰트 등 다양한 옵션이 존재합니다.

 


Span Class

Span에 관련된 Class가 여러개 존재하며 상황에 맞게 효율적인 Class를 선택하여 사용해야 합니다.

Class Edit Text Edit Span 데이터 구조
SpannedString NO NO Array
SpannableString NO YES Array
SpannableStringBuilder YES YES List
  • Span을 생성하고 어떠한 수정이 발생하지 않으면 SpannedString을 사용합니다.
  • Text를 변경하지 않으며 적은 수의 Span을 변경하면 SpannableString을 사용합니다.
  • Text의 변경 또는 많은 수의 Span을 변경하면 SpannableStringBuilder를 사용합니다.

String과 StringBuilder의 차이점을 생각하면 쉽습니다.


Span 유형

크게 텍스트에 미치는 Span과 문단에 미치는 Span으로 구분되고 텍스트에 미치는 Span은 다시 스타일과 크기로 나누어진다.

  • AbsoluteSizeSpan(int size, boolean dip) : 절대 크기, dip -> dp 단위로 변환
  • AlignmentSpan.Standard(Layout.Alignment align) : Align 설정
  • BackgroundColorSpan(int color) : 배경색
  • BulletSpan(int gapWidth, int color, int bulletRadius) : 총알 모양
  • ClickableSpan : 클릭 가능한 Span
  • ForegroundColorSpan(int color) : 글자색
  • ImageSpan : bitmap, drawable, resource로 이미지를 만들고 baseline을 설정할 수 있다.
  • LeadingMarginSpan.Standard(int first, int rest) : 문단의 간격을 설정할 수 있다. first는 첫문장의 간격 rest는 나머지 문장의 간격
  • LineHeightSpan.Standard(int height) : 줄 간격
  • MaskFilterSpan(MaskFilter filter) : 마스크 처리 (모자이크 같은)
  • QuoteSpan(int color, int stripeWidth, int gapWidth) : 인용구
  • RelativeSizeSpan(float proportion) : 상대크기
  • ScaleXSpan(float proportion) : scaleX
  • StrikethroughSpan() : 가운데 줄
  • StyleSpan(int style) : 두껍게, 이텔릭
  • URLSpan(String url) : 클릭한 URL로 이동
  • UnderlineSpan() : 밑줄 생성
  • TypefaceSpan(Typeface typeface) : 글꼴
  • SubscriptSpan() : 텍스트를 아래로 배치
    private fun executeSpan() {
        with(binding.foregroundSpan) {
            val spannableString = SpannableString(text).apply {
                setSpan(ForegroundColorSpan(Color.BLUE), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
                setSpan(BackgroundColorSpan(Color.GRAY), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
                setSpan(UnderlineSpan(), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
                setSpan(StyleSpan(Typeface.ITALIC), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

            setText(spannableString, TextView.BufferType.SPANNABLE)
        }
    }

Spanned Flag

INCLUSIVE : Span이 같이 적용되지 않는다.

EXCLUSIVE : Span이 같이 적용되지 않는다.

  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE : 왼쪽, 오른쪽 텍스트가 추가될 때 Span이 같이 적용되지 않음
  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE : 텍스트가 왼쪽에 추가되면 Span이 같이 적용되지 않고 오른쪽에 추가되면 Span이 같이 적용된다.

주의할 점

setText는 여러 메소드로 오버로딩되어 있다. 만약 setText에서 BufferType을 지정하지 않으면 Spannable의 복사본을 SpannedString으로 만들어서 저장한다. 즉 TextView에서 getText를 하여 얻은 CharSequence는 Spanned이기 때문에 수정할 수 없습니다.

추후에 Span을 수정해야할 경우 BufferType을 SPANNABLE로 지정해야 합니다.

    private fun executeSpan() {
        with(binding.foregroundSpan) {
            val spannableString = SpannableString(text).apply {
                setSpan(ForegroundColorSpan(Color.BLUE), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
                setSpan(BackgroundColorSpan(Color.GRAY), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
                setSpan(UnderlineSpan(), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
                setSpan(StyleSpan(Typeface.ITALIC), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
            }

            setText(spannableString, TextView.BufferType.SPANNABLE)
        }
    }

Git (예제 코드)

https://github.com/KangTaeJong98/Example

 

GitHub - KangTaeJong98/Example: My Example Code

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

'Android (안드로이드)' 카테고리의 다른 글

Android in A..Z - Fragment  (0) 2021.10.04
Android in A..Z - Glide Advanced  (0) 2021.10.01
Android in A..Z - Module 베포 (Jitpack)  (0) 2021.09.02
Android in A..Z - Intent  (0) 2021.08.30
Android In A..Z - Google API (Google Map)  (0) 2021.08.18
Comments