-
Eng : Best practices for text on Android
Es : Texto en Android: mejores prácticas
여기서 Text, Texto 에만 bold 처리를 하고 싶다면?
-
간단한 styling 은 HTML tag 를 이용하자.
Text 와 Texto 를 각각 <b> tag 로 감싸고, setText(Html.fromHtml(…)) API 호출을 해주자.
-
HTML tag 로 해결하기 어려운 복잡한 케이스는 annotation 을 이용하자.
strings.xml 에 <annotation> 태그를 사용하면 된다.
custom key, value pair 를 xml 에 정의하고, annotation tag 를 사용할 수 있다.
string resource 를 SpannedString 로 얻어오면, 이 pair 는 자동으로 Annotation span 으로 변환된다.
우리가 해야할 일은 이 annotation 들을 parse 해서 적절한 span 으로 변경해주면 된다.
-
ex)
<strings.xml>
en : <string name=“title”>Best practices for <annotation font=“title_emphasis”>text</annotation> on Android</string>
es : <string name=“title”><annotation font=“title_emphasis”>Texto</annotation> en Android: mejores prácticas</string>
<code>
val titleText = getText(R.string.title) as SpannedString
val annotations = titleText.getSpans(0, titleText.length, Annotation::class.java)
val spannableString = SpannableString(titleText)
for (annotation in annotations){
if (annotation.key == “font”){
val fontName = annotation.value
if (fontName == “title_emphasis”){
val typeface = getFontCompat(R.font.permanent_marker)
spannableString.setSpan(CustomTypefaceSpan(typeface), titleText.getSpanStart(annotation), titleText.getSpanEnd(annotation), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
}
}
styledText.text = spannableString
cf)
CharSequence <- Spanned <- Spannable <- SpannableString
CharSequence <- Spanned <- SpannedString
Spans : 마크업 객체로 text 를 style 하는데 사용
SpannedString : 텍스트 변경 불가. 마크업 변경 불가
SpannableString : 텍스트 변경 불가. 마크업 변경 가능. (SpannableStringBuilder 도 있다.)
-
RecyclerView 등을 통해 지속적으로 이 작업을 하는 것은 performance, memory issue 가 있을 수 있다. 그 이유는..
1. Framework 가 Annotation span 을 한번 추가해주고, CustomTypefaceSpan 을 내가 한번 추가해준다.
2. SpannableString 이 매번 생성된다.
이 문제를 해결하기 위해서는 caching 을 이용하는 것이 추천된다. (돼왕 : 쉽게 안 될수도..)
-
Annotation span 은 ParcelableSpan 이기 때문에 key, value 도 parcel, unparcel 될 수 있다.
그래서 styling 된 text 를 intent 를 통해 넘기려면, Annotation 을 추가해서 넘기면 된다.
val spannableString = SpannableString(“My spantastic text”)
val annotation = Annotation(“font”, “title_emphasis”)
spannableString.setSpan(annotation, 3, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// spannabelString 을 intent 에 putExtra 로 넘기고,
// 읽을 때는 (as 를 이용) SpannableString 으로 받으면 된다.
참고자료 : https://medium.com/google-developers/styling-internationalized-text-in-android-f99759fb7b8f
끝
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] FileProvider 에 알아보자 (0) | 2021.02.16 |
---|---|
[android] WebChromeClient 의 file upload (1) | 2021.01.29 |
[android] finishAffinity() 와 finishAndRemoveTask() 에 대하여 with 실험 (0) | 2021.01.27 |
[android] context 마스터 하기! (0) | 2021.01.26 |
[android] ViewModel & LiveData 의 pattern & anti-pattern (0) | 2021.01.22 |
댓글