Проигрыватель 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
Ответы
Ответ 1
Инструмент упаковки 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 и кода трудно сказать, что именно ваша проблема, но, надеюсь, это поможет вам понять механизмы немного лучше.
Ответ 2
Чтобы приложение использовало форматированные строки из ресурсов, вы должны исправить свой xml. Итак, например
<string name="app_name">Your App name, ver.%d</string>
следует заменить на
<string name="app_name">Your App name, ver.%1$d</string>
Подробнее см. этот.
Ответ 3
Вы можете избежать%, используя %% для анализатора XML, но он отображается дважды на устройстве.
Чтобы показать его один раз, попробуйте следующий формат: \%%
Например,
<string name="zone_50">Fat Burning (50\%% to 60\%%)</string>
отображается как
Fat Burning (50% to 60%)
в устройстве
Ответ 4
Используйте
<string name="win_percentage">%d%% wins</string>
чтобы получить
80% wins
как форматированная строка.
Я использую метод String.format()
для ввода числа вместо %d
.
Ответ 5
В файле strings.xml вы можете использовать любой знак Unicode, который вы хотите.
Например, число Unicode для знака процента равно 0025:
<string name="percent_sign">%</string>
Вы можете увидеть полный список знаков Unicode здесь
Ответ 6
чтобы избежать символа процента, вам просто нужно %%
например:
String.format("%1$d%%", 10)
возвращает "10%"
Ответ 7
Не совсем ваша проблема, но похожая.
Если в вашей записи строки имеется несколько форматирования, вы не должны использовать "% s" несколько раз.
НЕ НЕ:
<string name="entry">Planned time %s - %s (%s)</string>
DO:
<string name="entry">Planned time %1$s - %2$s (%3$s)</string>
Ответ 8
Вы можете избежать% in xml с %%, но вам нужно установить текст в коде, а не в макет xml.
Ответ 9
Это может быть случай, когда среда IDE становится слишком строгой.
Идея звуковая, в общем, вы должны указать порядок подстановочных переменных, чтобы при добавлении ресурсов для другого языка ваш код Java не нуждался в изменении. Однако есть две проблемы:
Во-первых, строка, такая как:
You will need %.5G %s
который будет использоваться как Вам понадобится 2.1200 мг, будет иметь порядок одинаково на любом языке, поскольку это количество массы всегда представляется в этом порядке с научной точки зрения.
Во-вторых, если вы указали порядок переменных на том языке, на котором указаны ваши ресурсы по умолчанию (например, на английском языке), вам нужно указать только позиции в строках ресурсов для языков, которые используют другой порядок по умолчанию язык.
Хорошей новостью является то, что это легко исправить. Несмотря на то, что нет необходимости указывать позиции, а среда IDE слишком строгая, просто укажите их в любом случае. В приведенном выше примере используйте:
Вам понадобится% 1 $.5G% 2 $s
Ответ 10
Попробуйте это (справа):
<string name="content" formatted="false">Great application %s ☞ %s ☞ %s \\n\\nGo to download this application %s</string>
Ответ 11
Сложный метод: используя знак малого процента, как показано ниже
<string name="zone_50">Fat Burning (50﹪ to 60﹪)</string>
Процент входа в Википедии
Ответ 12
В официальной документации Google используйте% 1 $s и% 2 $s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling
Здравствуйте,% 1 $s! У вас есть% 2 $d новых сообщений.
Ответ 13
Предположим, вы хотите показать (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);
Ответ 14
Попробуйте использовать обратную косую черту перед ним, как показано ниже:
\%