안드로이드 XML 백분율 기호


309

%기호가 사용되는 문자열 배열이 있습니다 . %is 를 사용하기에 적합한 형식 입니다 %. 해당 배열에 여러 문자열 %이 있으면이 오류가 발생합니다.

 Multiple annotations found at this
 line:
 - error: Multiple substitutions specified in non-positional format;
   did you mean to add the formatted="false" attribute?
 - error: Found tag </item> where </string-array> is expected

6
이 오류의 원인이되는 XML을 게시 할 수 있습니까? 원인을 보지 않고 문제를 식별하는 것은 매우 어려울 수 있습니다.
Chris Cashwell

이것은 2 개 이상의 % 기호가있는 문자열로 쉽게 복제 할 수있는 오류입니다.
zaid

서식 목적을 찾지 않으면 더 나은 방법 을 수행하십시오.
Shishir Gupta

필자의 경우 서식 매개 변수를 % 1 $ s 대신 1 % $ s로 잘못 입력했습니다.
Ashokchakravarthi Nagarajan

답변:


467

Android Asset Packaging Tool ( aapt)은 최신 릴리스에서 매우 엄격 해졌 으며 이제 모든 Android 버전에 사용 됩니다. 더 이상 위치가 아닌 형식 지정자를 허용 하지 않기 때문에 발생하는 aapt-error가 생성 됩니다 .

다음은 리소스 문자열에 % 기호를 포함시키는 방법에 대한 몇 가지 아이디어입니다.

문자열에 형식 지정자 또는 대체가 필요하지 않은 경우 단순히 formatted속성 을 사용하여 다음 과 같이 설정할 수 있습니다 false.

<string formatted="false">%a + %a == 2%a</string>

이 경우 문자열은 형식 문자열로 사용 Formatter되지 않으므로 % 기호를 이스케이프하지 않아도됩니다. 결과 문자열은 "% a + % a == 2 % a"입니다.

formatted="false"속성 을 생략하면 문자열이 형식 문자열로 사용되므로 % 기호를 이스케이프해야합니다. 이것은 이중 %로 올바르게 수행됩니다.

<string>%%a + %%a == 2%%a</string>

이제 aapt오류는 없지만 사용 방법에 따라 Formatter형식 인수 없이 a 를 호출 하면 결과 문자열은 "%% a + %% a == 2 %% a"일 수 있습니다 .

Resources res = context.getResources();

String s1 = res.getString(R.string.str);
// s1 == "%%a + %%a == 2%%a"

String s2 = res.getString(R.string.str, null);
// s2 == "%a + %a == 2%a"

xml과 코드가 없으면 정확히 문제가 무엇인지 말하기 어렵지만 바라는 것은 메커니즘을 조금 더 잘 이해하는 데 도움이되기를 바랍니다.


1
나는 이것이 작동해야하기 때문에 이것을 대답으로 선택했지만 분명히 해당 문자열과 함께 실행중인 버그가 있으므로 ive는 % %와 "XXX.replaceAll ("%% ","% ");
zaid

4
formatted = false를 사용하면 잘 작동합니다. <string name = "information_description"formatted = "false"> \ 'Sweet \'무게 기준으로 설탕의 10 % ~ 20 % 심지어 35 % </ string>
누군가

1
formatted = false도 저에게 잘 작동합니다. %%를 사용하면 문자 그대로 장치와 에뮬레이터에서 %%로 나타납니다.
samwize

format = false는 과거에 나에게 잘 작동했습니다. 지금 (ADT 22), 어떤 이유로 든 그렇지 않습니다. "str = mContext.getString (R.string.str,"hello ")"사용하면 다음과 같은 린트 경고가 표시됩니다. "형식 문자열 'str'은 (는) 유효한 형식 문자열이 아니므로 전달되지 않아야합니다. String.format "
안드로이드 개발자

1
<string-array />에서 액세스하는 경우 인쇄 비율에 \ u0025를 사용하십시오. 이것은 나를 위해 일했습니다.
Chintan Shah

157

앱에서 리소스의 형식화 된 문자열을 사용하도록하려면 xml을 수정해야합니다. 예를 들어

<string name="app_name">Your App name, ver.%d</string>

로 교체해야합니다

<string name="app_name">Your App name, ver.%1$d</string>

자세한 내용 은 이것을 볼 수 있습니다 .


2
고맙게도 누락 된 링크를 제공했습니다.
akauppi

22
여러 파라미터 교체 (문자열 등), 용도 %1$s, %2$s
CJBS

1
이 작은 것에 대해 누가 큰 대답을 읽을 것입니까? 감사합니다. 아래로 스크롤하여 귀하를 찾습니다.
Janaka R Rajapaksha 2016 년

73

XML 파서에 %%를 사용하여 %를 이스케이프 할 수 있지만 장치에 두 번 표시됩니다.

한 번 표시하려면 다음 형식을 시도하십시오. \%%

예를 들어

<string name="zone_50">Fat Burning (50\%% to 60\%%)</string> 

Fat Burning (50% to 60%)장치 와 같이 표시됩니다


6
\ %%는 Nexus 4 4.2.1에서 충돌을 일으 킵니다. 다른 사람을 테스트하지 않았습니다.
Jon Willis

이것은 문자열 포맷터를 사용하고 항상 하드 코딩 된 값을 프로그래밍 방식으로 설정 해야하는 것과 비교하여 문자열에 포함 할 백분율을 이미 알고있을 때 효과적입니다.
portfoliobuilder

Nexus 5.1.1에서도 충돌이 발생했습니다. @ViliusK 답변이 정답입니다.
Chan Jing Hong

2
% 대신 %% 만 사용
Sundeep1501

37

사용하다

<string name="win_percentage">%d%% wins</string>

얻을

80% wins 형식화 된 문자열로.

String.format()방법을 사용하여 대신 숫자를 삽입했습니다 %d.


12

strings.xml 파일에서 원하는 유니 코드 부호를 사용할 수 있습니다.

예를 들어 퍼센트 부호의 유니 코드 숫자는 0025입니다.

<string name="percent_sign">&#x0025;</string>

여기 에서 유니 코드 기호의 전체 목록을 볼 수 있습니다


1
그건 말이되지 않습니다. & # x0025; 및 %는 xml 파일에서 동일합니다.
BeniBela

자원 파일이 Java 자원으로 변환되고 그렇게하면 %문자가 리턴됩니다. 문제가 해결되지 않을까 걱정됩니다.
Paul Lammertsma

9

백분율 기호를 벗어나려면 %% 만 있으면됩니다.

예를 들면 다음과 같습니다.

String.format("%1$d%%", 10)

"10 %"를 반환


1
귀하의 답변은 다른 기존 답변들과 거의 동일합니다.
Ben Rhys-Lewis

10%not을 반환하기 때문에 ... 그리고 잘못되었습니다 %10. FIY : 사용할 String.format때마다 로케일을 지정해야합니다. 로케일을 넣지 않고 형식 번호에 아라비아 로케일을 사용하면 놀라게됩니다.
mtrakal

7

정확히 당신의 문제는 아니지만 비슷한 문제입니다.

문자열 항목에 둘 이상의 서식이있는 경우 "% s"를 여러 번 사용해서는 안됩니다.

하지 말아야 할 것 :

<string name="entry">Planned time %s - %s (%s)</string>

하다 :

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>

5

%%로 xml에서 %를 이스케이프 할 수 있지만 텍스트를 레이아웃 xml이 아닌 코드로 설정해야합니다.


1
예, 이중 %로 탈출하고 멋지게 컴파일합니다. 그러나 에뮬레이터 또는 장치에서 실행될 때 %%로 표시 될 수 있습니다.
samwize

5

IDE가 너무 엄격 해지는 경우 일 수 있습니다.

아이디어는 건전합니다. 일반적으로 대체 변수의 순서를 지정하여 다른 언어에 대한 리소스를 추가해야하는 경우 Java 코드를 변경할 필요가 없습니다. 그러나 이것에는 두 가지 문제가 있습니다.

먼저 다음과 같은 문자열입니다.

You will need %.5G %s

당신이 필요할 것입니다 2.1200 mg 은 그 질량의 양이 항상 과학적으로 그 순서로 표현되는 것과 같은 언어로 순서가있을 것입니다.

두 번째는 기본 자원이 지정된 언어 (예 : 영어)로 변수 순서를 놓는 경우 기본 언어와 다른 순서를 사용하는 언어의 자원 문자열에서 위치 만 지정하면된다는 것입니다.

좋은 소식은 간단하게 고칠 수 있다는 것입니다. 위치를 지정할 필요가없고 IDE가 지나치게 엄격하더라도 어쨌든 지정하십시오. 위의 예에서 다음을 사용하십시오.

% 1 $ .5G % 2 $ s가 필요합니다



3

이것을 시도하십시오 (오른쪽) :

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>


-1

런타임에 50 %를 표시하고 50을 입력한다고 가정합니다. 코드는 다음과 같습니다.

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

자바 클래스 에서이 코드를 사용하십시오 :

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.