2021. 1. 31. 21:29ㆍ개발/[Kotlin] 안드로이드 개발
안녕하세요!
다들 하나의 TextView를 사용하는데 살짝 중요한 키워드는 색깔을 바꿔주거나 글씨 크기를 키우거나
색을 바꾸고 싶은 경험이 있으실 겁니다.
예를 들어 아래와 같은 TextView가 있습니다. 개발자의 생각에 따라서 텍스트뷰를 2개 만들어서 할 수도 있을거 같은데요 이러한 행위는 코드가 한줄 추가되고 작업도 두 번 해줘야하는 번거로움이 생깁니다. 그러면 어떻게 특정 문자를 추출해낼 까요?
1. 변수에 담습니다.
우선은 텍스트뷰에 담을 문장을 변수에 담습니다.
val address = "현재 계신 곳은 ${gpsTracker.getArea().korean}\n거리두기 지침은 ${
CoronaData.getLevel(
gpsTracker.getArea()
)
}단계"
* 본인이 원하는 문장을 담으면 됩니다. 저는 제 코드를 그대로 사용하는 거라서 이렇게 담습니다.
2. SpannableStringBuilder 사용
그 다음 SpannableStringBuilder 을 사용하면
코드상에서 TextView 에 넣을 문자 일부의 색, 크기, 스타일을 변경할 수 있습니다.
val sps = SpannableStringBuilder(address)
이렇게 다른 변수에 SpannableStringBuilder(address)를 사용하여 저장합니다
후에 글씨 크기조정하거나 색깔을 바꿀 단어를 배열에 담아서 word 변수에 저장합니다
Ex) 만약 '여기' 일경우 val word = "여기" 로 해서 담아도 무관합니다.
val word = arrayListOf(
gpsTracker.getArea().korean,
CoronaData.getLevel(gpsTracker.getArea())
)
3. 반복문을 돌려서 setSpan으로 크기를 조정하거나 색을 변경합니다.
1. 글씨 크기 조정
// 크기조정
for (i in word.indices) {
val start = address.indexOf(word[i])
val end = start + word[i].length
sps.setSpan(
RelativeSizeSpan(1.3f),
start,
end,
SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
// 텍스트뷰에 저장합니다.
YourTextView.text = sps
소스 설명 : word의 배열 크기만큼 for문이 돌아가고 address(현재 계신 곳은 서울 단계는 2.5단계입니다)에서 word[i] 즉 서울, 2.5단계의 인덱스(Int)값을 start에 저장하고 end = start + word[i].length 서울이나 2.5단계의 길이를 받아서 end에 넣습니다.
그 후 아까 SpannableStringBuilder를 사용할 수 있게한 sps변수를 사용해 RealtiveSizeSpan으로 현재 TextView의 1.3배를 크게 하고 그 범위 start, end를 지정한 후 다음과 같이 설정할 수 있습니다.
- AbsoluteSizeSpan(size)를 사용하면 절대적인 크기를 지정할 수 있습니다.
SPAN_EXCLUSIVE_EXCLUSIVE : 왼쪽 제거, 오른쪽 제거
SPAN_EXCLUSIVE_INCLUSIVE : 왼쪽 제거, 오른쪽 포함
SPAN_INCLUSIVE_EXCLUSIVE : 왼쪽 포함, 오른쪽 제거
SPAN_INCLUSIVE_INCLUSIVE : 왼쪽 포함, 오른쪽 포함
2. 색깔 바꾸기
sps.setSpan(ForegroundColorSpan(Your Color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
이상입니다 감사합니다 ^^
'개발 > [Kotlin] 안드로이드 개발' 카테고리의 다른 글
[안드로이드] Retrofit2를 사용한 GET/POST 서버통신 with Kotlin (2) | 2021.03.22 |
---|---|
[안드로이드] Navagation Safe Args를 사용해 데이터 전달 Fragment간 데이터전달 (0) | 2021.02.01 |
[안드로이드]네비게이션 드로어(Navigation Drawer) JetPack 제대로 쓰자! (0) | 2021.01.17 |
[안드로이드&&Firebase] Node.js 웹 서버를 사용해 FCM 푸시알람 전송 방법(5) (3) | 2020.11.09 |
[안드로이드&&Firebase] Node.js 웹 서버를 사용해 FCM 푸시알람 전송 방법(3) (0) | 2020.11.09 |