[Android] Do not concatenate text displayed with setText
문제 개요
TextView의 내용을 setText()
메서드를 이용해 설정할 때 Do not concatenate text displayed with setText. Use resource string with placeholders. 라는 경고문을 자주 볼 수 있다.
대략 setText로 표시된 텍스트를 +
로 연결해서 사용하지 말고 리소스 문자열을 placeholder와 함께 사용하라는 내용인데 어떻게 해결할 수 있을까?
해결
답은 문자열 서식 지정에 있다. 아래의 코드와 같이 문자열 리소스에서 원하는 자리에 들어갈 값을 서식 인수 format argument를 추가하여 지정하는 것이다.
1 | <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string> |
위의 예시는 문자열에 두 개의 서식 인수가 존재하는데 %1$s
에는 문자열이, %2$d
에는 10진수 값이 들어간다. 여기서 주의해야 할 부분은 서식 인수의 syntax인데 아래와 같은 형태이다.
%[
인자의 인덱스
$]서식 지정자
- 인자의 인덱스 argument index는 문자열 리소스에서 서식 인수의 인덱스를 선택할 수 있게 해준다. 첫 번째 인자는
1$
, 두 번째는2$
, 세 번째는3$
와 같은 식이다. - 서식 지정자 format specifier는 데이터 타입을 지정하는 것인데, C언어 등에서 흔히 사용하는
%d
,%s
와 같은 서식 지정자와 동일한 개념이다.
문자열 리소스에서 서식 인수를 지정했다면 getString(int, Object...)
을 통해 아래의 코드와 같이 매개변수의 첫 번째 인자로 해당 문자열 리소스를 전달하고 차례로 서식 인수들에 들어갈 값을 전달하면 된다.
1 | var text = getString(R.string.welcome_messages, username, mailCount) |
결과적으로 +
로 연결된 텍스트가 아닌 문자열 서식 지정을 이용하여 getString(int, Object...)
의 값을 setText()
에 넣어주면 된다.
1 | testTextView.text = getString(R.string.welcome_messages, username, mailCount) |
References
-
Android Developers 가이드 | 문자열 서식 지정
-
Android Developers 가이드 | getString
-
StackOverflow | Android TextView : “Do not concatenate text displayed with setText”