Android XML パーセント記号
-
08-10-2019 - |
質問
文字列の配列があります。 %
という記号が使われています。を使用するための適切な形式 %
は %
. 。その配列に複数の文字列がある場合 %
このエラーが発生します。
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
解決
Androidアセットパッケージングツール(aapt
) になった 最新リリースでは非常に厳格です 現在使用されています すべて Androidバージョン。あなたが得ているaapt-errorは、もはや許せないので生成されます 非陽性形式の仕様.
リソース文字列に%シンボルを含める方法をいくつか紹介します。
文字列にフォーマットの仕様や置換が必要ない場合は、単に formatted
属性と設定 false
:
<string formatted="false">%a + %a == 2%a</string>
この場合、文字列はのフォーマット文字列として使用されません Formatter
したがって、%シンボルを逃れる必要はありません。結果の文字列は「%a +%a == 2%a」です。
省略した場合 formatted="false"
属性、文字列はフォーマット文字列として使用され、%シンボルから逃げる必要があります。これは、2倍の%で正しく行われます。
<string>%%a + %%a == 2%%a</string>
今 aapt
エラーはありませんが、使用方法によっては、結果の文字列は「%% 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とコードがなければ、あなたの問題が正確に何であるかを言うのは困難ですが、これにより、メカニズムが少し良くなるのに役立つことを願っています。
他のヒント
リソースからフォーマットされた文字列を使用してアプリを許可するには、XMLを修正する必要があります。たとえば、
<string name="app_name">Your App name, ver.%d</string>
に置き換える必要があります
<string name="app_name">Your App name, ver.%1$d</string>
あなたは見ることができます これ 詳細については。
XMLパーサーに%%を使用して%を逃れることができますが、デバイスで2回表示されます。
一度表示するには、次の形式を試してください。 \%%
例えば
<string name="zone_50">Fat Burning (50\%% to 60\%%)</string>
として表示されますFat Burning (50% to 60%)
デバイス内
使用する
<string name="win_percentage">%d%% wins</string>
取得するため
80% wins
フォーマットされた文字列として。
私は使用しています String.format()
の代わりに番号を挿入する方法 %d
.
strings.xmlファイルでは、任意のUnicodeサインを使用できます。
たとえば、パーセントサインのUnicode番号は0025です。
<string name="percent_sign">%</string>
ユニコードサインの包括的なリストを見ることができます ここ
パーセント記号をエスケープするには、%% が必要です。
例えば :
String.format("%1$d%%", 10)
「10%」を返します
正確には問題ではなく、同様の問題です。
文字列エントリに複数のフォーマットがある場合は、「%s」を複数回使用しないでください。
しないでください:
<string name="entry">Planned time %s - %s (%s)</string>
行う :
<string name="entry">Planned time %1$s - %2$s (%3$s)</string>
%%でXMLの%を逃れることができますが、レイアウトXMLではなく、テキストをコードで設定する必要があります。
これは、IDEがあまりにも厳格になるケースである可能性があります。
アイデアは健全です。一般に、代替変数の順序を指定して、別の言語にリソースを追加すると、Javaコードを変更する必要がないようにする必要があります。ただし、これには2つの問題があります。
まず、次のような文字列を次のようにします。
You will need %.5G %s
として使用される 2.1200 mgが必要です その量の質量は常にその順序で科学的に表されるため、任意の言語で順序を同じようにします。
2つ目は、デフォルトのリソースが指定されている言語(英語など)に変数の順序を置く場合、言語のリソース文字列の位置を指定するだけで、デフォルト言語に別の順序を使用する必要があることです。
良いニュースは、これが簡単に修正できることです。位置を指定する必要はありませんが、IDEは過度に厳格ですが、とにかく指定するだけです。上記の例では、使用してください。
%1 $ .5g%2 $ sが必要です
これを試してみてください(右):
<string name="content" formatted="false">Great application %s ☞ %s ☞ %s \\n\\nGo to download this application %s</string>
トリッキーな方法:以下のように小さなパーセントサインを使用する
<string name="zone_50">Fat Burning (50﹪ to 60﹪)</string>
Googleの公式ドキュメントごとに、%1 $ sと%2 $ sを使用してください http://developer.android.com/guide/topics/resources/string-resource.html#formattingandstyling
こんにちは、%1 $ s! %2 $ d新しいメッセージがあります。
(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);
以下のように、その前でバックスラッシュを使用してみてください。
\%