Android에서 String.xml에 String을 동적으로 추가 할 수 있습니까?


답변:


1035

포맷팅 및 스타일링

예, 문자열 리소스 에서 다음을 참조하십시오 . 서식 및 스타일링

을 사용하여 문자열의 형식을 지정해야하는 경우 문자열 String.format(String, Object...)인수에 형식 인수를 추가하면됩니다. 예를 들어 다음 리소스를 사용하십시오.

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

이 예제에서 형식 문자열에는 두 개의 인수 %1$s가 있습니다. 문자열과 %2$d10 진수입니다. 다음과 같이 애플리케이션의 인수로 문자열을 형식화 할 수 있습니다.

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

기본 사용법

참고 getString형식 문자열과 같은 문자열을 사용하는 과부하가 있습니다 :

String text = res.getString(R.string.welcome_messages, username, mailCount);

복수형

복수를 처리해야 할 경우 다음을 사용하십시오.

<plurals name="welcome_messages">
    <item quantity="one">Hello, %1$s! You have a new message.</item>
    <item quantity="other">Hello, %1$s! You have %2$d new messages.</item>
</plurals>

첫 번째 mailCount매개 변수는 사용할 형식 (단일 또는 복수)을 결정하는 데 사용되며 다른 매개 변수는 대체 항목입니다.

Resources res = getResources();
String text = res.getQuantityString(R.plurals.welcome_messages, mailCount, username, mailCount);

자세한 내용은 문자열 리소스 : 복수형 을 참조하십시오.


61
첫 번째 코드 샘플의 String.format 호출은 실제로 필요하지 않습니다. Resources.getString ()은 형식화를 지원합니다. developer.android.com/reference/android/content/res/… , java.lang.Object ...)
Arnaud

16
String.xml의 Plurals의 경우 R.string.welcome_messages 대신 R.plurals.welcome_messages로 ID를 제공해야합니다.
om252345

마지막 항목 문자열 만 반환하는 여러 가지 ... 어떻게 문자열을 추가 할 수 있습니까?
CoDe

1
당신의 문자열의 서식이 방법을 사용하는 경우, 그것은 XML 문자열 텍스트에 포함 된 수는 같은 하이퍼 링크 등으로 사용될 수있는 모든 메타 태그 제거
조나단

4
문자열은 % 1 $ s, 10 진수는 % 2 $ d, 정수는 무엇을 의미합니까? % 1, % 2의 의미는 무엇입니까?이 매개 변수의 계수입니까?
reegan29

260

보충 답변

언제 처음으로 톱 %1$s%2$d허용 대답에, 그것은 아무 의미하지 않았다. 좀 더 설명해 드리겠습니다.

이를 형식 지정 자라고합니다. xml 문자열에서 형식은 다음과 같습니다.

%[parameter_index$][format_type] 
  • % : 퍼센트 부호는 형식 지정자의 시작을 나타냅니다.
  • parameter index : 숫자 뒤에 달러 기호가옵니다. 당신이 문자열에 삽입하고 싶었다 세 개의 매개 변수를 가지고 있다면, 그들은 호출 할 것이다 1$, 2$하고 3$. 자원 문자열에 배치하는 순서는 중요하지 않으며 매개 변수를 제공하는 순서 만 중요합니다.
  • 형식 유형 하십시오 있습니다 많은 당신이 일을 포맷 할 수있는 방법은 ( 설명서를 참조하십시오 ). 다음은 일반적인 것들입니다.

    • s
    • d 십진 정수
    • f 부동 소수점 수

회색 부분이 프로그래밍 방식으로 삽입되는 다음 형식의 문자열을 만듭니다.

내 동생 Mary12나이가 많다.

string.xml

<string name="my_xml_string">My sister %1$s is %2$d years old.</string>

MyActivity.java

String myString = "Mary";
int myInt = 12;
String formatted = getString(R.string.my_xml_string, myString, myInt);

노트

  • getString활동 중이 어서 사용할 수 있습니다 . 사용할 수 context.getResources().getString(...)없는 경우 사용할 수 있습니다.
  • String.format() 또한 문자열을 형식화합니다.
  • 1$2$용어는 순서대로 사용 할 필요가 없습니다. 즉, 2$앞에 올 수 있습니다 1$. 다른 단어 순서를 사용하는 언어의 앱을 국제화 할 때 유용합니다.
  • %1$s반복하려면 XML에서 형식 지정자를 여러 번 사용할 수 있습니다 .
  • %%실제 %캐릭터 를 얻는 데 사용 합니다 .
  • 자세한 내용은 다음 유용한 자습서를 참조하십시오. Android SDK 빠른 팁 : 자원 문자열 형식화

125

Java 코드를 사용하지 않고 실제 strings.xml 파일의 매개 변수를 사용하려는 경우 :

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "WhereDat">
  <!ENTITY author "Oded">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

이것은 리소스 파일에서 작동하지 않습니다. 즉, 변수는 필요한 각 XML 파일로 변수를 복사해야합니다.


<! [CDATA [& param;
Hermann Poilpre

2
<!DOCTYPE... ]>별도의 파일로 부품 을 정의하고 여러 리소스 파일에 포함시키는 방법이 있습니까? 이것을 달성하기위한 트릭?
prom85

18

똑같은 것을 찾고 마침내 다음과 같은 매우 간단한 해결책을 찾았습니다. 최고 : 그것은 즉시 작동합니다.
1. 문자열 리소스를 변경하십시오.

<string name="welcome_messages">Hello, <xliff:g name="name">%s</xliff:g>! You have 
<xliff:g name="count">%d</xliff:g> new messages.</string>

2. 문자열 대체를 사용하십시오.

c.getString(R.string.welcome_messages,name,count);

여기서 c는 컨텍스트이고 name 은 문자열 변수이며 int 변수를 계산 합니다.

당신은 포함해야합니다

<resources xmlns:xliff="http://schemas.android.com/apk/res-auto">

당신의 res / strings.xml에. 나를 위해 작동합니다. :)


2
xliff형식 지정자 주위의 태그 의 요점은 무엇입니까 ? %s%d지정자를 단독으로 사용하는 것과 달리 어떤 추가 가치가 있습니까?
Richard Le Mesurier 11

xliff 태그의 "name"속성은 번역기에 대체 할 내용에 대한 힌트를 제공하는 방법입니다. 때로는 "% s"의 의미를 추측하기가 쉽지 않습니다.
hugomg 2018

3

Kotlin에서는 다음과 같이 문자열 값을 설정하면됩니다.

<string name="song_number_and_title">"%1$d ~ %2$s"</string>

레이아웃에서 텍스트보기를 작성하십시오.

<TextView android:id="@+id/song_number_and_title"/>

Anko를 사용하는 경우 코드 에서이 작업을 수행하십시오.

val song = database.use { // get your song from the database }
song_number_and_title.setText(resources.getString(R.string.song_number_and_title, song.number, song.title))  

응용 프로그램 컨텍스트에서 리소스를 가져와야 할 수도 있습니다.


5
Java 예제와 다른 점은 무엇입니까? 나는 차이가 없다
Janusz Hain


1

res / values ​​/ string.xml에

<resources>
    <string name="app_name">Hello World</string>
    <string name="my_application">Application name: %s, package name: %s</string>
</resources>

자바 코드에서

String[] args = new String[2];
args[0] = context.getString(R.string.app_name);
args[1] = context.getPackageName();
String textMessage = context.getString(R.string.my_application,(Object[]) args);


1

백분율 (%)을 쓰려면 다음을 복제하십시오.

<string name="percent">%1$d%%</string>

label.text = getString(R.string.percent, 75) // Output: 75%.

간단히 쓰면 %1$d%오류가 발생 Format string 'percent' is not a valid format string so it should not be passed to String.format합니다.


0

예! Java / Kotlin 코드를 작성하지 않고 빌드 할 때이 작은 라이브러리를 사용하여 XML 만 작성할 수 있으므로 빌드 시간에 그렇게하므로 앱이 영향을받지 않습니다 : https://github.com/LikeTheSalad/android 문자열 참조

용법

당신의 문자열 :

<resources>
    <string name="app_name">My App Name</string>
    <string name="template_welcome_message">Welcome to ${app_name}</string>
</resources>

빌드 후 생성 된 문자열 :

<!--resolved.xml-->
<resources>
    <string name="welcome_message">Welcome to My App Name</string>
</resources>

0

문제에 대한 직접적인 Kotlin 솔루션 :

strings.xml

<string name="customer_message">Hello, %1$s!\nYou have %2$d Products in your cart.</string>

kotlinActivityORFragmentFile.kt :

val username = "Andrew"
val products = 1000
val text: String = String.format(
      resources.getString(R.string.customer_message), username, products )

0

문자열 파일에서 이것을 사용하십시오

<string name="redeem_point"> You currently have %s points(%s points = 1 %s)</string>

그리고 코드에서 적절하게 사용하십시오.

coinsTextTV.setText(String.format(getContext().getString(R.string.redeem_point), rewardPoints.getReward_points()
                        , rewardPoints.getConversion_rate(), getString(R.string.rs)));

-1

허용 된 답변의 Kotlin 버전 ...

val res = resources
val text = String.format(res.getString(R.string.welcome_messages), username, mailCount)

3
더 올바른 방법은 resources.getString(int, ... args)대신 인수와 함께 메소드 를 사용 하는 것입니다 String.format. 이 코드에는 val키워드 이외의 kotlin 사양이 없습니다 . 답변을 참조하십시오 msbodw001
dant3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.