개발하면서 만났던 Warning 중에 제목과 같은 Warning들이 있었다.
이번에는 코드로 text를 지정할 때 만났던 Warning과 문자열 리소스에 대한 정보를 추가적으로 다뤄볼 예정이다.
Do not concatenate text displayed with 'setText'
내가 작성한 코드
binding.tvCalendarMonth.text = "${year}.${df.format(month.yearMonth.monthValue)}"
맞이한 Warning
Warning: Do not concatenate text displayed with 'setText'. Use resource string with placeholders.
→ setText로 보여줄 때, 텍스트 concat 하지 마라. resource string을 사용해라~
❓ res > values > strings.xml의 리소스를 사용하라는 말인데, 값을 넣을 건데 string.xml을 사용하라니..
😶🌫️ C나 C++에서 printf할 때 같이 출력할 변수를 %d로 나타냈던 것 처럼 사용하는 것인가?
찾은 답변
화내지 말고 "~" + "~"로 써라~, String.format()을 써라 등등의 답변이 있었지만
답변 중에 Blackbelt라는 분의 답변을 보면,
리소스는 type이 Object인 varargs를 가지고 있는 getString 메소드의 오버로드 버전이 있다. 따라서 strings.xml에서 올바른 place holders를 사용하여서 문자열을 올바르게 설정하면 이 버전을 사용하여 최종 String의 형식화된 버전을 가져올 수 있다.
%[argument_index]$format_specifier
- argument_index : 변수의 순서를 나타내는 번호
- format_specifier : 변수의 타입(ex. Int → d(decimal), Float → f, String → s)
이 형식으로 나타내면 된다.
수정한 코드
strings.xml
<string name="main_year_month">%1$s.%2$s</string>
MainActivity.kt
// binding.tvCalendarMonth.text = "${year}.${df.format(month.yearMonth.monthValue)}"
binding.tvCalendarMonth.text = getString(R.string.main_year_month, year, df.format(month.yearMonth.monthValue))
다음과 같이 나타낼 수 있었고, 결과값은 같았다.
아무래도 값이 다른 같은 형태의 문자열을 반복적으로 작성한다면 위와 같은 방법이 필수적일 것 같다.
❗argument index를 나타낼 때 인덱스 번호 앞에 %를 붙이는데, string에 %를 나타내고 싶을 땐?
<string name="percentage">%1$d%%</string>
→ %%로 나타내면 %를 사용할 수 있다!
공식문서의 문자열 리소스
이 내용은 Android 공식 문서에서도 볼 수 있었다. <문자열 서식 지정> 으로 문자열의 서식을 지정해야 할 경우, 문자열 리소스에 서식 인수를 추가하여 지정할 수 있다고 설명되어 있다.
문자열 리소스에는 문자열 서식 뿐만 아니라 HTML 마크업을 사용하여 스타일을 지정할 수도 있다.
HTML에서 많이 사용하는 <b>, <i>, <u>, <s> 등을 strings.xml에서도 동일하게 적용할 수 있는 것이다.
- 굵은꼴: <b>, <em>
- 기울임꼴: <i>, <cite>, <dfn>
- 텍스트 25% 확대: <big>
- 텍스트 20% 축소: <small>
- 글꼴 속성 설정: <font face=”font_family“ color=”hex_color”>. (사용 가능한 폰트 monospace, serif, sans_serif 등)
- 고정 폭 글꼴 집합: <tt>
- 취소선: <s>, <strike>, <del>
- 밑줄: <u>
- 위첨자: <sup>
- 아래첨자: <sub>
- 글 머리꼴: <ul>, <li>
- 줄바꿈: <br>
- 분할: <div>
- CSS 스타일: <span style=”color|background_color|text-decoration”>
- 문단: <p dir=”rtl | ltr” style=”…”>
☝️ 여기서 주의할 점은 HTML 마크업을 사용한 문자열의 경우, getString(R.string.~)를 사용하면 안된다.
😶🌫️ 이 사실을 모르고 getString으로 문자열을 적용했을 때 아무런 스타일이 나타나지 않아서 문서를 다시 읽어보니
→ format(), getString() 메서드가 문자열에서 모든 스타일 정보를 제거한다고 한다.
→ 나는 getText(R.string.~)으로 해결하였다.
예전에 Span에 대해서 포스팅을 했었는데, 간단한 스타일 지정은 마크업을 사용하는게 더 편리할 것 같다.
이번 Warning을 살펴본 계기로 그동안 작성했던 불필요한 코드를 많이 줄일 수 있게 되었고,
역시 아는 것이 많을 수록 좋은 코드를 작성할 수 있다는 것을 다시 한번 느꼈다. 또 공식 문서를 잘 읽어야 한다는 것도...ㅎㅎ
reference >
'ANDROID > Android 개발 이슈 & 해결' 카테고리의 다른 글
[Android] Compose에서 Kakao 로그인 구현하기 (1) | 2024.10.04 |
---|---|
[Android] LiveData를 1번만 관찰하는 방법 (2) | 2022.04.06 |
[Android] CalendarView 라이브러리 추천 : kizitonwose/CalendarView (1) | 2022.04.05 |
[Android] Room Migration : 데이터베이스 테이블 수정하기 (0) | 2022.03.26 |
[Android] 조회, 수정이 가능한 Room Database 디버깅 라이브러리 (4) | 2022.03.10 |
[Android] LiveData를 유연하게 사용하는 방법 (feat.Transformations) (0) | 2022.03.07 |
[Android] 화면 터치로 키보드 내려가게 하기 (0) | 2022.02.25 |
[Android] Retrofit2 통신 오류 해결 : Expected BEGIN_OBJECT but was BEGIN_ARRAY at path $ (0) | 2022.01.04 |
댓글