안드로이드에서 TextView 사용시,
TextView 내부의 텍스트 글자마다 서로 다른 스타일(색깔, 크기, 볼드체 등)을 적용해야 할 때가 있다.
물론 글자마다 각각 TextView를 생성해서 처리해 주어도 되긴 한다.
하지만 TextView를 하나만 사용하면서 내부의 각 문자열들을 따로 처리할 수 있다면 더욱 효율적일 것이다.
안드로이드는 SpannableStringBuilder를 통해 이런 기능을 지원해준다.
# SpannableStringBuilder 사용방법
1. TextView의 text를 SpannableStringBuilder로 변환
2. 스타일/크기/색상 Span 객체 생성
3. SpannableStringBuilder에 Span 적용
4. TextView의 text에 SpannableStringBuilder 설정
자세한 사용방법은 아래와 같다.
(코드로 보면 훨씬 간단하고 쉽다)
# TextView/EditText 의 내부 텍스트 일부 스타일 적용 방법
1.레이아웃 XML파일
- TextView 속성 추가( bufferType="spannabe" )
* bufferType을 "spannable"로 설정해주어야 SpannableStringBuilder를 통해 문자열의 스타일을 조정할 수 있다.
* TextView는 bufferType이 디폴트로 "normal"로 설정되어서 spannabe로 별도 설정해주어야 한다.
* EditText는 bufferType="editable"로 지정(spannable포함)되어 있어서 별도로 설정해주지 않아도 된다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SpannableActivity">
<!-- android:bufferType="spannable" 속성을 추가 설정 -->
<TextView
android:id="@+id/textViewSpannable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="012345"
android:bufferType="spannable"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2. 액티비티(Java/Kotlin) 파일
1) TextView 참조
- 레이아웃 XML에 생성한 TextView를 참조
2) TextView.text 취득
- TextView에 설정된 텍스트 문자열을 취득하여 String으로 변환한다.
3) TextView.text 를 SpannableStringBuilder 로 변환
- String으로 변환한 문자열을 SpannableStringBuilder로 변환한다.
4) Span 객체 생성 및 적용
- Span 객체 종류: StyleSpan(스타일), RelativeSizeSpan(사이즈 배수), ForegroundColorSpan(색상)
- SpannableStringBuilder에 span 적용: setSpan(Span객체, 시작Index, 종료Index, *Span적용설정상수)
5) TextView.text에 SpannableStringBuilder 적용
- Span을 통해 적용한 스타일/사이즈/색상이 TextView에 적용된다.
위의 순서대로 코드를 작성하여 주석을 달아 두었다.
class SpannableActivity : AppCompatActivity() {
// TextView 변수
lateinit var textView:TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_spannable)
// 1. TextView 참조
textView = findViewById(R.id.textViewSpannable)
// 2. String 문자열 데이터 취득
val textData: String = textView.text.toString()
// 3. SpannableStringBuilder 타입으로 변환
val builder = SpannableStringBuilder(textData)
// 4-1. index=0 에 해당하는 문자열(0)에 볼드체적용
val boldSpan = StyleSpan(Typeface.BOLD)
builder.setSpan(boldSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
// 4-2 index=2에 해당하는 문자열(2)에 글자크기 3배 적용
val sizeBigSpan = RelativeSizeSpan(3.0f)
builder.setSpan(sizeBigSpan, 2, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
// 4-3 index=4에 해당하는 문자열(4)에 빨간색 적용
val colorBlueSpan = ForegroundColorSpan(Color.RED)
builder.setSpan(colorBlueSpan, 4, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
// 5. TextView에 적용
textView.text = builder
}
}
* setSpan() 함수의 마지막 매개변수는 Span이 적용된 좌우측에 문자열이 추가될 때 Span을 적용할 것지 설정하는 값이다.
- SPAN_EXCLUSIVE_EXCLUSIVE: 왼쪽X, 오른쪽X
- SPAN_EXCLUSIVE_INCLUSIVE: 왼쪽X, 오른쪽O
- SPAN_INCLUSIVE_EXCLUSIVE: 왼쪽O, 오른쪽X
- SPAN_INCLUSIVE_INCLUSIVE: 왼쪽O, 오른쪽O
Spannabe 에 대한 더 자세한 내용은 아래 가이드 레퍼런스를 참고
https://developer.android.com/guide/topics/text/spans
# 실행 결과
하나의 TextView만 사용하면서
0은 볼드체가 적용되었고,
2는 글자 사이즈가 3배가 되었고,
4는 글자색상이 빨간색이 되었다.
'개발(Development) > Android(안드로이드)' 카테고리의 다른 글
[안드로이드] TextView 임시 텍스트 설정 방법(tools:text): 개발시에만 노출, 런타임 비노출 (0) | 2021.09.01 |
---|---|
[안드로이드] 커스텀뷰: Paint 적용된 텍스트 너비, 높이(width, height) 확인 방법 (0) | 2021.08.31 |
[안드로이드] 앱 버전 업데이트 빌드 및 배포 방법(구글 플레이) (0) | 2021.08.29 |
[안드로이드] getDimension() vs. getDimensionPixelSize() 차이 (0) | 2021.08.27 |
[안드로이드] 안드로이드 폰 장치 OS 버전 체크 방법(Build.VERSION.SDK_INT) (0) | 2021.08.26 |
댓글