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

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

282 голосов
/ 11 декабря 2010

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

 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

Ответы [ 14 ]

444 голосов
/ 11 декабря 2010

Android Asset Packaging Tool (aapt) стал очень строгим в своем последнем выпуске и теперь используется для всех версий Android.Получаемая вами aapt-ошибка генерируется потому, что она больше не допускает непозиционных спецификаторов формата .

Вот несколько идей о том, как включить% -symbol в строки ресурсов.

Если вам не нужны никакие спецификаторы формата или подстановки в вашей строке, вы можете просто использовать атрибут formatted и установить его на false:

<string formatted="false">%a + %a == 2%a</string>

Inв этом случае строка не используется в качестве строки формата для Formatter, поэтому вам не нужно экранировать ваши% -символы.В результате получается строка «% a +% a == 2% a».

Если вы пропустите атрибут formatted="false", строка будет использоваться в качестве строки формата, и вы должны экранировать% -symbols.Это правильно сделано с двойным -%:

<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 и кода трудно сказать, что именно вашПроблема в том, что, надеюсь, это поможет вам лучше понять механизмы.

153 голосов
/ 25 февраля 2011

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

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

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

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

. Вы можете увидеть this для деталей.

56 голосов
/ 07 октября 2011

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

Чтобы показать его один раз, попробуйте следующий формат: \%%

Например

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

отображается как Fat Burning (50% to 60%) в устройстве

31 голосов
/ 31 марта 2015

Используйте

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

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

80% wins в качестве форматированной строки.

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

10 голосов
/ 29 апреля 2013

В вашем файле strings.xml вы можете использовать любой желаемый знак Юникода.

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

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

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

8 голосов
/ 11 апреля 2016

для экранирования символа процента, вам просто нужно %%

например:

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

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

7 голосов
/ 03 января 2017

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

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

НЕ:

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

DO:

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>
5 голосов
/ 29 июля 2014

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

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

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

You will need %.5G %s

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

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

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

Вам потребуется% 1 $ .5G% 2 $ s

5 голосов
/ 15 марта 2011

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

3 голосов
/ 29 мая 2015

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

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

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

...