web-dev-qa-db-ja.com

Android XMLパーセント記号

%シンボルが使用されている文字列の配列があります。 %を使用するための適切な形式は%です。その配列に複数の%を持つ文字列がある場合、このエラーが発生します。

 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
280
zaid

Android Asset Packaging Tool(aapt)は 最新リリースでは非常に厳しい になり、allAndroidバージョン。 非定位置書式指定子 が許可されなくなったため、取得しているaaptエラーが生成されます。

以下に、リソース文字列に%記号を含める方法をいくつか示します。

文字列に書式指定子や置換が必要ない場合は、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はエラーを表示しませんが、使用方法によっては、フォーマットなしで Formatter が呼び出された場合、結果の文字列は「%% 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とコードがなければ、問題が何であるかを正確に言うことは困難ですが、うまくいけば、メカニズムを少しよく理解するのに役立つでしょう。

441
Josef Pfleger

リソースからフォーマットされた文字列を使用するアプリを許可するには、xmlを修正する必要があります。だから、例えば

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

に置き換える必要があります

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

詳細については this をご覧ください。

153
Paul E.

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

一度表示するには、次の形式を試してください:\%%

例えば

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

デバイスではFat Burning (50% to 60%)として表示されます

56
pavblazek

つかいます

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

取得するため

書式設定された文字列としての80% wins

%dの代わりにString.format()メソッドを使用して番号を挿入しています。

29
ViliusK

Strings.xmlファイルでは、必要なUnicode記号を使用できます。

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

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

Unicode記号の包括的なリストを見ることができます ここ

10
Asaf Pinhassi

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

例えば ​​:

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

「10%」を返します

7
landerlyoung

あなたの問題ではなく、同様の問題。

文字列エントリに複数の書式設定がある場合、「%s」を複数回使用しないでください。

しないでください

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

行う :

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

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

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

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

You will need %.5G %s

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

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

幸いなことに、これは簡単に修正できます。位置を指定する必要はなく、IDEが過度に厳密であっても、とにかく指定するだけです。上記の例の場合:

%1 $ .5G%2 $ sが必要です

5
Steve Waring

%%を使用してxmlの%をエスケープできますが、レイアウトxmlではなくコードでテキストを設定する必要があります。

5
Mee

これを試してください(右):

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

トリッキーな方法:以下のように小さなパーセント記号を使用する

 <string name="zone_50">Fat Burning (50&#65130; to 60&#65130;)</string> 

ウィキペディアのパーセント記号

3
Bao Le

Google公式ドキュメントごとに、%1 $ sおよび%2 $ sを使用してください http://developer.Android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

こんにちは、%1 $ s! %2 $ d個の新しいメッセージがあります。

1
techtinkerer