335

%記号が使用されている文字列の配列があります。を使用するための適切な形式%はです%。その配列に複数の文字列があると、%このエラーが発生します。

 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
4

14 に答える 14

491

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>

これでエラーは発生しませんが、使用方法によっては、フォーマット引数なしでaaptaが呼び出された場合、結果の文字列は "%% a + %% a == 2%%a"になる可能性があります。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とコードがないと、問題が正確に何であるかを言うのは困難ですが、うまくいけば、これがメカニズムをもう少しよく理解するのに役立ちます。

于 2010-12-11T15:06:44.977 に答える
161

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

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

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

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

詳細はこちらをご覧ください。

于 2011-02-25T06:44:23.147 に答える
105

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

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

例えば

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

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

于 2011-10-07T17:46:59.450 に答える
50

使用する

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

取得するため

80% winsフォーマットされた文字列として。

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

于 2015-03-31T16:22:56.747 に答える
16

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

例えば ​​:

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

「10%」を返します

于 2016-04-11T14:13:41.293 に答える
14

文字列.xmlファイルでは、任意のUnicode記号を使用できます。

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

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

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

于 2013-04-29T07:24:58.240 に答える
7

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

于 2011-03-15T08:54:36.250 に答える
7

正確にはあなたの問題ではありませんが、同様の問題です。

文字列エントリに複数のフォーマットがある場合は、「%s」を複数回使用しないでください。

しないでください:

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

行う :

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>
于 2017-01-03T08:39:18.187 に答える
6

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

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

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

于 2015-05-29T07:40:53.057 に答える
5

これは、IDEが厳しすぎる場合である可能性があります。

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

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

You will need %.5G %s

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

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

良いニュースは、これは簡単に修正できることです。位置を指定する必要はなく、IDEが厳しすぎる場合でも、とにかく指定するだけです。上記の例では、次を使用します。

%1 $ .5G%2$sが必要になります

于 2014-07-28T22:14:24.037 に答える
3

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

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>
于 2013-01-04T17:51:00.637 に答える
1

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

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

于 2016-03-11T00:58:21.310 に答える
-2

表示(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);
于 2017-02-07T11:21:16.057 に答える
-19

以下のように、その前に円記号を使用してみてください。

\%
于 2010-12-11T00:19:02.883 に答える