J'ai un tableau de chaînes dans lequel le symbole %
est utilisé. Le format correct pour utiliser le %
est %
. Quand j'ai une chaîne dans ce tableau avec plusieurs %
, cela me donne cette erreur.
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 Asset Packaging Tool (aapt
) est devenu très strict dans sa dernière version et est maintenant utilisé pour all Android versions. L'erreur aapt que vous obtenez est générée car elle ne permet plus spécificateurs de format non positionnels .
Voici quelques idées pour inclure le symbole% dans vos chaînes de ressources.
Si vous n'avez pas besoin de spécificateurs de format ou de substitutions dans votre chaîne, vous pouvez simplement utiliser l'attribut formatted
et le définir sur false
:
<string formatted="false">%a + %a == 2%a</string>
Dans ce cas, la chaîne n'est pas utilisée comme chaîne de format pour Formatter
, vous n'avez donc pas besoin d'échapper à vos symboles-%. La chaîne résultante est "% a +% a == 2% a".
Si vous omettez l'attribut formatted="false"
, la chaîne est utilisée comme chaîne de format et vous devez échapper aux symboles%. Ceci est correctement fait avec double-%:
<string>%%a + %%a == 2%%a</string>
Maintenant, aapt
ne vous donne plus d'erreur, mais selon l'utilisation que vous en faites, la chaîne résultante peut être "%% a + %% a == 2 %% a" si un Formatter
est invoqué sans aucun 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"
Sans code xml ni code, il est difficile de dire en quoi consiste exactement votre problème, mais j'espère que cela vous aidera à comprendre un peu mieux les mécanismes.
Pour autoriser l'application à l'aide de chaînes formatées à partir de ressources, vous devez corriger votre code xml. Donc, par exemple
<string name="app_name">Your App name, ver.%d</string>
devrait être remplacé par
<string name="app_name">Your App name, ver.%1$d</string>
Vous pouvez voir this pour plus de détails.
Vous pouvez échapper à% en utilisant %% pour l'analyseur XML, mais il apparaît deux fois dans device.
Pour l'afficher une fois, essayez le format suivant: \%%
Par exemple
<string name="zone_50">Fat Burning (50\%% to 60\%%)</string>
est indiqué par Fat Burning (50% to 60%)
dans l'appareil
Utilisation
<string name="win_percentage">%d%% wins</string>
obtenir
80% wins
sous forme de chaîne formatée.
J'utilise la méthode String.format()
pour obtenir le numéro inséré à la place de %d
.
pour échapper au symbole de pourcentage, vous avez juste besoin de %%
par exemple :
String.format("%1$d%%", 10)
renvoie "10%"
Dans votre fichier strings.xml, vous pouvez utiliser n’importe quel signe Unicode de votre choix.
Par exemple, le nombre Unicode pour le signe de pourcentage est 0025:
<string name="percent_sign">%</string>
Vous pouvez voir une liste complète des signes Unicode ici
Pas exactement votre problème mais un problème similaire.
Si vous avez plusieurs mises en forme dans votre entrée de chaîne, vous ne devez pas utiliser "% s" plusieurs fois.
NE PAS:
<string name="entry">Planned time %s - %s (%s)</string>
FAIRE :
<string name="entry">Planned time %1$s - %2$s (%3$s)</string>
Cela pourrait être un cas où IDE devient trop strict.
L’idée est bonne. En général, vous devez spécifier l’ordre des variables de substitution afin que, si vous ajoutez des ressources pour une autre langue, votre code Java ne soit pas modifié. Cependant, il y a deux problèmes avec ceci:
Tout d'abord, une chaîne telle que:
You will need %.5G %s
pour être utilisé comme vous aurez besoin de 2.1200 mg l'ordre sera le même dans n'importe quelle langue, car cette quantité de masse est toujours représentée scientifiquement dans cet ordre.
La seconde est que si vous définissez l'ordre des variables dans la langue de vos ressources par défaut (par exemple l'anglais), il vous suffit de spécifier les positions dans les chaînes de ressources pour les langues. Utilisez un ordre différent de votre langue par défaut.
La bonne nouvelle est que c'est simple à corriger. Même s'il n'est pas nécessaire de spécifier les positions et que le IDE est trop strict, spécifiez-les quand même. Pour l'exemple ci-dessus, utilisez:
Vous aurez besoin de% 1 $ .5G% 2 $ s
Vous pouvez échapper le% in xml avec %%, mais vous devez définir le texte dans le code, pas dans le xml de présentation.
Essayez celui-ci (à droite):
<string name="content" formatted="false">Great application %s ☞ %s ☞ %s \\n\\nGo to download this application %s</string>
Une méthode délicate: utiliser un petit signe de pourcentage comme ci-dessous
<string name="zone_50">Fat Burning (50﹪ to 60﹪)</string>
Selon la documentation officielle de Google, utilisez% 1 $ s et% 2 $ s http://developer.Android.com/guide/topics/resources/string-resource.html#FormattingAndStyling
Bonjour,% 1 $ s! Vous avez% 2 $ d nouveaux messages.