Android Study

안드로이드 string.xml 을 사용 할 때 동적값 적용하기

85chong 2019. 4. 25. 15:33
728x90
반응형
SMALL

이전에 말했던 안드로이드 string.xml 기본사용법 외에 간혹 유동적인 값을 string.xml 에 포함 시켜야 할 때가 있다.

그냥 클래스 단에서 작업하여 문자열을 하드 코딩으로 넣어도 되긴하지만, 만약 그 문자열이 다국어 에도 적용이 되야 한다면, 국가별로 하나하나 나눠서 작업을 해야 하기 때문에 시간과 코드 낭비가 심해지게 된다. 이때 기존의 string.xml 을 사용하면 다국어는 해결이 된다. 하지만 다국어에는 고정값이기 때문에 이 값을 변경 하려면 또 많은 코드를 넣어야 된다. 이때 좀 더 쉽게 적용하는 방법을 아래에 설명하겠다.

 

기본 사용법은 생략하고, 

Ex) tv_a 라는 TextView 에 상황에 따라 변경되는 값을 다국어로 하고싶다라고, 가정한다면

 

1. string key 값안에 유동적인 값을 추가할 부분에(int 형태를 예로들면) %d 넣어준다.

<string name="keyA">"Give me the %d dollar"</string>

 

2. 텍스트 set 하기전에 섞어주는 작업을 아래와같이해준다키값을 앞에 놓고, 뒤에 유동적으로 넣어줄 값을 넣어준다.

int number = 4;

String content = String.format(getResources().getString(R.string.keyA), number);

 

3. 텍스트에 위에서 섞은 값을 적용시킨다.

tv_a.setText(content);

 

이렇게 하면 tv_a 에 "Give me the 4 dollar" 가 뜨게 된다. 위의 4 되는 값을 조건에 따라 바꿔주기만 하면 계속 변환하여 적용 시킬 수 있게 된다.

 

한가지 더 가정을 해보자.

Ex) tv_a 라는 TextView 에 상황에 따라 변경되는 두개의 값을 다국어로 하고싶다라고, 가정한다면

 

위에서 했던것과 같은 방법으로 하면된다. 

<string name="keyA">"give me  %d dollar and Tommorow give me %d dollar"</string>

 

int number = 4;

int number_second = 100;

String content = String.format(getResources().getString(R.string.keyA), number, number_second);

 

위와같이 왼쪽에서 오른쪽 순서로 값을 넣어주면, 이론상  give me 4 dollar and Tommorow give me 100 dollar

가 나와야 하지만, 실행 시키면 아래와 같은 에러가 뜨게 된다.

...Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?...

위와 같은 에러의 이유는 순서대로 넣긴 했지만 포맷 순서를 정하는 방법(추후에 적어보도록 노력할예정)이나 또는 그냥 순서대로 적용시켜라 라는 명령을 해주면 간단하게 해결된다.

 

이제 위에 해당하는 string key 값에 코드하나 추가하자.

기존 : <string name="keyA">"give me  %d dollar and Tommorow give me %d dollar"</string>

수정 : <string name="keyA" formatted="false">"give me  %d dollar and Tommorow give me %d dollar"</string>

 

위와같이 formmated 추가해주면 해결된다.

 

추후에 구글드라이브에 있는 구글 시트를 이용한 다국어 처리하는 방법과 해당 string 을 안드로이드 와 IOS 코드로 자동으로 뽑아내는 구글 스크립트 소스도 추가로 올릴 예정이다.

 

-끝-