Android 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 2010

これは、%記号が2つ以上ある任意の文字列で簡単に再現できるエラーです。
zaid

フォーマットの目的を探していない場合は、達成するためのより良い方法
Shishir Gupta、2014

私の場合、フォーマットパラメータを%1 $ sではなく1%$ sと誤って入力しました。
Ashokchakravarthi Nagarajan 2016

回答:


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"属性を省略すると、文字列はフォーマット文字列として使用され、%記号をエスケープする必要があります。これはdouble-%で正しく行われます。

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

今、aaptあなたにエラーを与えていないが、あなたはそれを使用する方法に応じて、結果の文字列をすることができ、「%% A + %% A == 2 %%」場合はFormatter任意のフォーマットなしで起動された引数

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
動作するはずなので、これを回答として選択しましたが、明らかにその文字列に遭遇するバグがあるため、%%と "XXX.replaceAll(" %% "、"% ");"を使用することにしました。
zaid

4
formatted = falseを使用するとうまく動作します。これは私がそれをどのように使用したかです:<string name = "information_description" formatted = "false"> \ 'Sweet \' 10%から20%35%重量の砂糖</ string>
誰か誰か

1
formatted = falseは私にとってもうまくいきます。%%を使用して、それは文字通り..私のデバイスとエミュレータ上%%として現れた
samwize

過去には、formatted = falseはうまく機能していました。現在(ADT 22)、何らかの理由でサポートされていません。また、「str = mContext.getString(R.string.str、 "hello")」を使用すると、次のlint警告が表示されます。「フォーマット文字列 'str'は有効なフォーマット文字列ではないため、渡さないでください。 String.Formatの」
Androidデベロッパー

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 2014年

22
複数のパラメータ置換(例えば、文字列で)、使用する場合%1$s%2$sなど
CJBS

1
誰がこの小さなことについてそのような大きな答えを読むでしょうか?ありがとう、私はあなたを見つけるために下にスクロールします。
Janaka R Rajapaksha 2016年

73

XMLパーサーの%%を使用して%をエスケープできますが、デバイスで2回表示されます。

一度表示するには、次のフォーマットを試してください: \%%

例えば

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

Fat Burning (50% to 60%)デバイスのように表示さ れます


6
\ %%はNexus 4 4.2.1でクラッシュを引き起こします。他の人をテストしていません。
ジョンウィリス

これはうまく機能し、文字列に含めたいパーセントがすでにわかっている場合は簡単です。文字列フォーマッターを使用して、常にプログラムでこれらのハードコードされた値を設定する必要があります。
ポートフォリオ

これは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ファイルでは、任意のUnicode記号を使用できます。

たとえば、パーセント記号のUnicode番号は0025です。

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

Unicode標識の包括的なリストはこちらで確認できます


1
それは意味がありません。&#x0025; と%はxmlファイルで同一です。
BeniBela 2014年

リソースファイルはJavaリソースに変換され、その際に%文字が返されます。これで問題が解決しないと思います。
Paul Lammertsma 2014年

9

パーセント記号をエスケープするには、%%が必要です

例えば ​​:

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

「10%」を返します


1
あなたの答えは、他のいくつかの既存の答えとほとんど同じです
Ben Rhys-Lewis

...と、間違って10%%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 '19

5

これは、IDEが厳しすぎる場合です。

考え方は確かです。一般に、置換変数の順序を指定する必要があります。これにより、別の言語のリソースを追加した場合でも、Javaコードを変更する必要がなくなります。ただし、これには2つの問題があります。

まず、次のような文字列。

You will need %.5G %s

使用する必要があります2.1200 mgは、その量が常に科学的にその順序で表されるため、どの言語でも同じ順序になります。

2つ目は、デフォルトのリソースが指定されている言語(たとえば英語)で変数の順序を指定した場合、言語のリソース文字列内の位置を指定するだけで、デフォルトの言語とは異なる順序を使用できることです。

良いニュースは、これは簡単に修正できるということです。位置を指定する必要はなく、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>

Javaクラスでは、次のコードを使用します。

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

-16

以下のように、その前にバックスラッシュを使用してみてください。

\%

このソリューションはクラッシュにつながります。
Prinkal Kumar 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.