Android XML Процент Символ

242

У меня есть массив строк, в которых используется символ %. Правильный формат использования % - %. Когда у меня есть строка в этом массиве с несколькими %, она дает мне эту ошибку.

 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
  • 3
    Можете ли вы опубликовать XML, который вызывает эту ошибку? Может быть очень трудно определить проблему, не видя ее причину.
  • 0
    это ошибка, которая может быть легко воспроизведена любой строкой с 2 или более символами%.
Показать ещё 2 комментария
Теги:
xliff

14 ответов

392
Лучший ответ

Инструмент упаковки Android Asset (aapt) стал очень строгим в своем последнем выпуске и теперь используется для всех версий Android. Полученная вами ошибка 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 не дает вам никаких ошибок, но в зависимости от того, как вы его используете, результирующая строка может быть "%% 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 и кода трудно сказать, что именно ваша проблема, но, надеюсь, это поможет вам понять механизмы немного лучше.

  • 1
    я выбрал это как ответ, потому что он должен работать, но, очевидно, есть ошибка, с которой я сталкиваюсь с этой строкой, поэтому я решил использовать %% и "XXX.replaceAll (" %% ","% ");"
  • 4
    использование formatted = false работает хорошо. Вот как я это использовал: <string name = "information_description" formatted = "false"> \ 'Sweet \' от 10% до 20% и даже 35% сахара по весу </ string>
Показать ещё 10 комментариев
136

Чтобы приложение использовало форматированные строки из ресурсов, вы должны исправить свой xml. Итак, например

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

следует заменить на

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

Подробнее см. этот.

  • 2
    Спасибо, вы предоставили недостающую ссылку - буквально.
  • 22
    Для подстановки нескольких параметров (например, со строками) используйте %1$s , %2$s и т. Д.
Показать ещё 1 комментарий
34

Вы можете избежать%, используя %% для синтаксического анализа XML, но дважды отображается на устройстве.

Чтобы показать это, попробуйте использовать этот формат \%%, например

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

отображается как Сжигание жира (от 50% до 60%) в устройстве

  • 5
    \ %% вызывает сбои на Nexus 4 4.2.1. Не проверял других.
  • 0
    Это работает хорошо и легко, когда вы уже знаете процент, который вы хотите включить в ваши строки, по сравнению с использованием средства форматирования строк и тем, что вам всегда приходится устанавливать эти жестко закодированные значения программно.
Показать ещё 2 комментария
15

Используйте

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

чтобы получить

80% wins как форматированная строка.

Я использую метод String.format() для ввода числа вместо %d.

9

В файле strings.xml вы можете использовать любой знак Unicode, который вы хотите.

Например, число Unicode для знака процента равно 0025:

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

Вы можете увидеть полный список знаков Unicode здесь

  • 1
    В этом нет смысла. & # X0025; и% идентичны в XML-файле.
  • 0
    Файл ресурса преобразуется в ресурс Java, и при этом возвращается символ % . Боюсь, это не решит проблему.
Показать ещё 2 комментария
5

Это может быть случай, когда среда IDE становится слишком строгой.

Идея звуковая, в общем, вы должны указать порядок подстановочных переменных, чтобы при добавлении ресурсов для другого языка ваш код Java не нуждался в изменении. Однако есть две проблемы:

Во-первых, строка, такая как:

You will need %.5G %s

который будет использоваться как Вам понадобится 2.1200 мг, будет иметь порядок одинаково на любом языке, поскольку это количество массы всегда представляется в этом порядке с научной точки зрения.

Во-вторых, если вы указали порядок переменных на том языке, на котором указаны ваши ресурсы по умолчанию (например, на английском языке), вам нужно указать только позиции в строках ресурсов для языков, которые используют другой порядок по умолчанию язык.

Хорошей новостью является то, что это легко исправить. Несмотря на то, что нет необходимости указывать позиции, а среда IDE слишком строгая, просто укажите их в любом случае. В приведенном выше примере используйте:

Вам понадобится% 1 $.5G% 2 $s

4

Не совсем ваша проблема, но похожая.

Если в вашей записи строки имеется несколько форматирования, вы не должны использовать "% s" несколько раз.

НЕ НЕ:

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

DO:

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

Вы можете избежать% in xml с %%, но вам нужно установить текст в коде, а не в макет xml.

  • 1
    Да, он сбрасывается с двойным% и хорошо компилируется. Но при запуске на эмуляторе или даже на устройствах он может отображаться как %%.
3

Сложный метод: используя знак малого процента, как показано ниже

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

Процент входа в Википедии

3

Попробуйте это (справа):

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

чтобы избежать символа процента, вам просто нужно %%

например:

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

возвращает "10%"

  • 1
    Ваш ответ в значительной степени такой же, как несколько других существующих ответов
  • 0
    ... и неправильно, потому что возвращает 10% не %10 . FIY: Когда вы используете String.format вы должны каждый раз указывать Locale. Вы можете быть действительно удивлены, когда вы не используете Locale и не используете арабский язык для форматирования чисел ...
Показать ещё 1 комментарий
1

В официальной документации Google используйте% 1 $s и% 2 $s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Здравствуйте,% 1 $s! У вас есть% 2 $d новых сообщений.

-2

Предположим, вы хотите показать (50% OFF) и ввести 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);
-12

Попробуйте использовать обратную косую черту перед ним, как показано ниже:

\%
  • 0
    Та же ошибка, что и раньше.
  • 3
    это должно быть \ %%
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню