350 votes

Symbole de pourcentage XML Android

J'ai un tableau de chaînes de caractères dans lequel la valeur % est utilisé. Format approprié pour l'utilisation du symbole % es % . Lorsque j'ai une chaîne de caractères dans ce tableau avec plusieurs % il 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

6 votes

Pouvez-vous afficher le fichier XML qui est à l'origine de cette erreur ? Il peut être très difficile d'identifier un problème sans en voir la cause.

0 votes

Il s'agit d'une erreur qui peut facilement être reproduite par n'importe quelle chaîne contenant 2 symboles % ou plus.

0 votes

Si vous ne recherchez pas un objectif de formatage, mieux vaut manière à accomplir.

501voto

Josef Pfleger Points 37003

L'Android de l'Actif de l'Emballage de l'Outil (aapt) est devenu très strict dans sa dernière version et est maintenant utilisé pour toutes les versions d'Android. Aapt d'erreur que vous obtenez est générée, car il ne permet plus de non-positionnelle les spécificateurs de format.

Voici quelques idées sur comment vous pouvez inclure l' %-symbole dans vos chaînes de ressource.

Si vous n'avez pas besoin de tout les spécificateurs de format ou de substitutions dans votre chaîne, vous pouvez simplement utiliser l' formatted d'attribut et réglez - false:

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

Dans ce cas, la chaîne n'est pas utilisée comme une chaîne de format pour l' Formatter de sorte que vous n'avez pas échapper à votre %-symboles. La chaîne résultante est "% + %a == 2%".

Si vous omettez l' formatted="false" d'attribut, la chaîne est utilisée comme une chaîne de format et vous avez pour échapper à l' %-symboles. C'est bien fait avec des double-%:

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

Maintenant, aapt vous donne aucune erreur, mais selon la façon dont vous l'utilisez, la chaîne résultante peut être "%% + %%a == 2%%a" si un Formatter est invoquée sans n'importe quel 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 xml et le code c'est difficile de dire exactement quel est ton problème mais j'espère que cela vous aide à comprendre les mécanismes un peu mieux.

1 votes

J'ai choisi cette réponse parce qu'elle devrait fonctionner, mais apparemment il y a un bug avec cette chaîne, donc j'ai décidé d'utiliser %% et "XXX.replaceAll("%%", "%") ;"

5 votes

En utilisant formatted=false fonctionne bien. Voici comment je l'ai utilisé : <string name="information_description" formatted="false"><string>"Sweet\" 10% à 20% voire 35% de sucre en poids</string>.

2 votes

Formatted=false fonctionne bien pour moi aussi. En utilisant %%, il s'est littéralement affiché comme %% sur mon appareil et mon émulateur

163voto

Paul E. Points 475

Pour permettre à l'application d'utiliser les chaînes formatées des ressources, vous devez corriger votre xml. Ainsi, par exemple

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

doit être remplacé par

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

Vous pouvez voir este pour plus de détails.

2 votes

Merci, vous avez fourni le chaînon manquant - littéralement.

25 votes

Pour la substitution de plusieurs paramètres (par exemple avec des chaînes de caractères), utiliser %1$s , %2$s etc.

1 votes

Qui lira une réponse aussi importante pour cette petite chose ? Merci, je défile vers le bas pour vous trouver.

122voto

pavblazek Points 169

Vous pouvez échapper à % en utilisant %% pour l'analyseur XML, mais il est affiché deux fois dans le dispositif.

Pour l'afficher une fois, essayez le format suivant : \%%

Par exemple

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

est indiqué comme suit Fat Burning (50% to 60%) dans l'appareil

6 votes

\%% provoque des plantages sur Nexus 4.2.1. Je n'ai pas testé les autres.

1 votes

Cela fonctionne bien et c'est facile lorsque vous connaissez déjà les pourcentages que vous voulez inclure dans vos chaînes, au lieu d'utiliser le formateur de chaînes et de devoir toujours définir ces valeurs codées en dur par programme.

0 votes

J'ai eu le même problème avec le Nexus 5.1.1. La réponse de @ViliusK est la bonne.

15voto

Pinhassi Points 4297

Dans votre fichier strings.xml, vous pouvez utiliser n'importe quel signe Unicode.

Par exemple, le numéro Unicode du signe de pourcentage est 0025 :

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

Vous pouvez consulter une liste complète des signes Unicode aquí

1 votes

Cela n'a aucun sens. % et % sont identiques dans un fichier xml.

0 votes

Le fichier de ressources est converti en ressource Java. % est renvoyée. Je crains que cela ne résolve pas le problème.

5voto

Steve Waring Points 209

Il pourrait s'agir d'un cas où l'IDE devient trop strict.

L'idée est bonne, en général vous devriez spécifier l'ordre des variables de substitution de sorte que si vous ajoutez des ressources pour un autre langage, votre code Java n'aura pas besoin d'être modifié. Cependant, deux problèmes se posent :

Tout d'abord, une chaîne de caractères telle que :

You will need %.5G %s

à utiliser comme Vous aurez besoin de 2.1200 mg L'ordre sera le même dans toutes les langues, car cette quantité de masse est toujours représentée dans cet ordre d'un point de vue scientifique.

Deuxièmement, si vous placez l'ordre des variables dans la langue dans laquelle vos ressources par défaut sont spécifiées (par exemple, l'anglais), il vous suffit de spécifier les positions dans les chaînes de ressources pour les langues qui utilisent un ordre différent de celui de votre langue par défaut.

La bonne nouvelle, c'est qu'il est facile d'y remédier. Même s'il n'est pas nécessaire de spécifier les positions, et que l'IDE est trop strict, il suffit de les spécifier quand même. Pour l'exemple ci-dessus, utilisez :

Vous aurez besoin de %1$.5G %2$s

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X