web-dev-qa-db-fra.com

Android Symbole de pourcentage XML

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
287
zaid

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.

446
Josef Pfleger

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.

153
Paul E.

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

57
pavblazek

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.

32
ViliusK

pour échapper au symbole de pourcentage, vous avez juste besoin de %%

par exemple :

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

renvoie "10%"

10
landerlyoung

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">&#x0025;</string>

Vous pouvez voir une liste complète des signes Unicode ici

10
Asaf Pinhassi

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>
7
Garytech

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

5
Steve Waring

Vous pouvez échapper le% in xml avec %%, mais vous devez définir le texte dans le code, pas dans le xml de présentation.

5
Mee

Essayez celui-ci (à droite):

<string name="content" formatted="false">Great application %s  ☞  %s  ☞  %s \\n\\nGo to download this application %s</string>
3
sonida

Une méthode délicate: utiliser un petit signe de pourcentage comme ci-dessous

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

Signe de pourcentage sur Wikipedia

3
Bao Le

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.

1
techtinkerer