ANDROID/Android 개발 이슈 & 해결

[Android] Do not concatenate text displayed with 'setText'

주 녕 2022. 3. 27. 23:06
728x90

개발하면서 만났던 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로 나타냈던 것 처럼 사용하는 것인가?

 

찾은 답변

 

Android TextView : "Do not concatenate text displayed with setText"

I am setting text using setText() by following way. prodNameView.setText("" + name); prodOriginalPriceView.setText("" + String.format(getString(R.string.string_product_rate_with_ruppe_sign), "" +...

stackoverflow.com

화내지 말고 "~" + "~"로 써라~, String.format()을 써라 등등의 답변이 있었지만

답변 중에 Blackbelt라는 분의 답변을 보면,

리소스는 type이 Object인 varargs를 가지고 있는 getString 메소드의 오버로드 버전이 있다. 따라서 strings.xml에서 올바른 place holders를 사용하여서 문자열을 올바르게 설정하면 이 버전을 사용하여 최종 String의 형식화된 버전을 가져올 수 있다.
    %[argument_index]$format_specifier
  1. argument_index : 변수의 순서를 나타내는 번호
  2. 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에 대해서 포스팅을 했었는데, 간단한 스타일 지정은 마크업을 사용하는게 더 편리할 것 같다.

 

[Android] Text 부분 bold, color 커스텀 with Span

오늘의 포스팅 주제는 텍스트 부분 커스텀입니다! 지금 진행 중인 인스타그램 클론 프로젝트에서 댓글 화면을 만들고 있었고, 작성된 댓글이 나타나는 부분을 실제 인스타그램처럼 UI를 만들고

junyoung-developer.tistory.com

 

 

이번 Warning을 살펴본 계기로 그동안 작성했던 불필요한 코드를 많이 줄일 수 있게 되었고,

역시 아는 것이 많을 수록 좋은 코드를 작성할 수 있다는 것을 다시 한번 느꼈다. 또 공식 문서를 잘 읽어야 한다는 것도...ㅎㅎ


reference >

 

문자열 리소스  |  Android 개발자  |  Android Developers

문자열 리소스 문자열 리소스는 옵션 사항인 텍스트 스타일 지정 및 서식 지정 기능과 함께 애플리케이션에 사용할 수 있는 텍스트 문자열을 제공합니다. 애플리케이션에 문자열을 제공할 수

developer.android.com

 

728x90