Nuke Olaf - Log Store

[Android] 안드로이드 - DataBinding 에서 String Format 적용 본문

Android

[Android] 안드로이드 - DataBinding 에서 String Format 적용

NukeOlaf 2020. 5. 31. 22:53

안드로이드에서 String.xml 을 동적으로 사용하고 싶은 상황이 있을 수 있다.

예를 들어, 로그인한 유저의 이름을 불러주면서 새로 온 메시지의 개수를 알려줘야하는 String Resource 가 있다고 생각해보자. 그 문장은 아래와 같이 string formatter 를 사용한 format string 으로 표현될 수 있다.

여기서 사용되는 string format 은 Java5+ 의 String.format() (문자열 형식 지정)과 같다. 서식 문자열을 사용한 형식 문자열을 만들 수 있다. (참고)

서식 문자열의 앞에 "%"를 붙여 문자열에 기술해 두면 그 그위치에 변수의 값을 형식화하여 넣을 수 있다. 

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

%1$s 는 첫 번째 파라미터에 String 값이 들어오고, %2$d 는 두 번째 파라미터에 십진수 숫자가 들어온다는 뜻의 인자이다. 복수의 파라미터가 사용될때는 앞에 [argument index] 가 붙고, 파라미터가 한개인 경우에는 붙이지 않아도 무방하다고 하는데,직접 해보니까 에러가 뜬다. argument index 를 붙여야 에러가 안뜨는 듯

위의 String Resource 를 Kotlin 에서 가져와 사용할때는 다음과 같이 작성한다.

var text = getString(R.string.welcome_messages, username, mailCount)

 

그런데, 놀랍게도 dataBinding 을 사용하면 xml 에서도 위의 String Format 을 사용하여 text 를 표현할 수가 있다.

android:text= "@{@string/welcome_messages(vm.username, vm.mailcount)}"

이렇게 표현하니 훨씬 간단해졌다.

하지만, 위의 방식을 사용하면, data 가 아직 준비되지 않은 상태인경우
" Hello, null! You have null new messages. "
이런식으로 문자열이 표현된다는 문제점이 있다.

이에 대한 해결책으로는 dataBinding 표현식에서 검사해주는 방법이 있다.

android:text= "@{vm == null ? @string/loading : 
    @string/welcome_messages(vm.username, vm.mailcount)}"

 

 

출처 : https://developer.android.com/guide/topics/resources/string-resource#formatting-strings

https://stackoverflow.com/questions/38978499/how-do-i-use-databinding-to-combine-a-string-from-resources-with-a-dynamic-varia

 

 

Comments