본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] 국제화 text style 입히기

by 돼지왕 왕돼지 2021. 1. 27.
반응형

 

-

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

 

Styling internationalized text in Android

In a previous article we talked about styling characters or paragraphs in Android using spans. But all the examples used were based on hard…

medium.com

 

 

 

 

반응형

댓글