Android XML Percent Symbol

android, android-resources, xliff, xml

Solution

The Android Asset Packaging Tool (`aapt`) has become very strict in its latest release and is now used for all Android versions. The aapt-error you're getting is generated because it no longer allows non-positional format specifiers.

Here are a few ideas how you can include the %-symbol in your resource strings.

If you don't need any format specifiers or substitutions in your string you can simply make use of the `formatted` attribute and set it to `false`:

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

In this case the string is not used as a format string for the `Formatter` so you don't have to escape your %-symbols. The resulting string is "%a + %a == 2%a".

If you omit the `formatted="false"` attribute, the string is used as a format string and you have to escape the %-symbols. This is correctly done with double-%:

<string>%%a + %%a == 2%%a</string>

Now `aapt` gives you no errors but depending on how you use it, the resulting string can be "%%a + %%a == 2%%a" if a `Formatter` is invoked without any format arguments:

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"

Without any xml and code it is difficult to say what exactly your problem is but hopefully this helps you understand the mechanisms a little better.

Problem

I have an array of strings in which the `%` symbol is used. Proper format for using the `%` is `&#37;`. When I have a string in that array with multiple `&#37;` it gives me this error. ``` 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 ```

Original source

Related problems