-
Notifications
You must be signed in to change notification settings - Fork 4
✏️ String Resource ViewModel 에서 시원하게 써보자
K004_김명석 edited this page Dec 2, 2022
·
5 revisions
val registeredSizeText = gifticonList.map { list ->
if (list.isNotEmpty()) {
"${list.size}개 등록됨"
} else {
""
}
}.stateIn(viewModelScope, SharingStarted.Eagerly, UIText.Empty)
- 하드 코딩된 텍스트를 사용하면 안된다
- xml/string.xml 을 사용하기에는 Context 를 사용하면 안된다
위의 조건이 우리를 힘들게 만들고 있다
기존에는 이러한 상황을 해결 하기 위해 TextView를 2개를 사용하고 list.size 만 넘기는 방법을 선택하거나
Activity 에서 collect 하여 getString을 이용하여 Format 된 String 을 표현하였다
이러한 상황을 해결하고자 UIText 객체와 DataBinding을 이용 해보기로 하였다.
sealed class UIText {
object Empty : UIText()
data class DynamicString(val string: String) : UIText()
class StringResource(
@StringRes val resId: Int,
vararg val args: Any
) : UIText()
fun asString(context: Context): String {
return when (this) {
is DynamicString -> string
is StringResource -> context.getString(resId, *args)
is Empty -> ""
}
}
}
UIText 는 아래의 3가지 클래스로 구성된다.
- StateFlow 등의 초기상태나 비어있는 값을 위한 Empty
- Runtime에 너무 다양하게 바뀌는 값을 위한 DynamicString
- 여러개의 Formatted String 도 적용할 수 있는 StringResource
@BindingAdapter("setUIText")
fun setUIText(view: TextView, uiText: UIText?) {
view.text = uiText?.asString(view.context) ?: ""
}
binding 초기화시 값이 null 이 들어오는 것을 대응을 해준다.
<TextView
android:id="@+id/tv_registered"
...
app:setUIText="@{vm.registeredSizeText}" />
xml 에서는 위와 같이 사용을 한다
<string name="add_gifticon_registered">%d개 등록됨</string>
string.xml 에 저장되어 있는 Resource
val registeredSizeText = gifticonList.map { list ->
if (list.isNotEmpty()) {
UIText.StringResource(R.string.add_gifticon_registered, list.size)
} else {
UIText.Empty
}
}.stateIn(viewModelScope, SharingStarted.Eagerly, UIText.Empty)
이제 위와 같이 리펙토링을 통해 ViewModel 에서도 원하는 Text를 표현할 수 있게되었다!
- 안드로이드에서 지문 인증 하기!
- Firebase Google 로그인 세팅 중 겪은 오류
- 양탐정의 viewModelScope.launch 살인사건 수사일지
- 쉿! KeyStore과 Cipher
- WorkManager 알림과 위젯을 사용해보자!
- 애니메이션으로 삡에 숨결 불어넣기
- 리뷰어 등록을 자동으로 해보자
- Mockk을 활용한 테스트
- 검색 결과를 Room에 캐싱해보자!
- Room One to Many
- CustomException 과 Result를 적극 활용해보자!
- View의 Event를 처리하기 위한 상태 클래스를 만들어보자!
- WorkManager 알림과 위젯을 사용해보자!