Question

J'ai un tableau de chaînes dans laquelle le symbole de % est utilisé. format approprié pour l'utilisation du % est %. Quand j'ai une chaîne 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
Était-ce utile?

La solution

L'outil d'emballage actif Android (aapt) est devenu très stricte dans sa dernière version et est maintenant utilisé pour toutes les versions Android. Le vous AAPT erreur obtenir est générée, car il ne permet plus Format non de position spécificateurs.

Voici quelques idées comment vous pouvez inclure le symbole% dans vos chaînes de ressources.

Si vous ne avez pas besoin de spécificateurs de format ou des substitutions dans votre chaîne, vous pouvez simplement utiliser l'attribut formatted et le mettre à false:

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

Dans ce cas, la chaîne n'est pas utilisé comme une chaîne de format pour le Formatter si vous n'avez pas d'échapper à vos% -Symboles. La chaîne résultante est "% a +% a == 2%".

Si vous ne spécifiez pas l'attribut formatted="false", la chaîne est utilisée comme une chaîne de format et vous devez échapper aux% -Symboles. Cela se fait correctement avec double -%:

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

aapt vous donne pas d'erreur, mais selon la façon dont vous l'utilisez, la chaîne résultante peut être "%% a + %% a == 2 %% un" si un Formatter est appelé sans 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, il est difficile de dire exactement ce que votre problème est, mais nous espérons que cela vous aide à comprendre les mécanismes un peu mieux.

Autres conseils

Pour permettre l'application en utilisant des chaînes formatées à partir des ressources que 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 cette pour plus de détails.

Vous pouvez échapper à l'aide %%% de l'analyseur XML, mais il est montré deux fois dans l'appareil.

Pour montrer une fois, essayez le format suivant: \%%

Par exemple

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

apparaît sous la forme Fat Burning (50% to 60%) dans l'appareil

Utilisez

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

pour obtenir

80% wins comme une chaîne formatée.

J'utilise la méthode de String.format() pour obtenir le numéro inséré au lieu de %d.

Dans votre fichier strings.xml vous pouvez utiliser un signe Unicode que vous voulez.

Par exemple, le nombre Unicode pour signe pour cent est 0025:

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

Vous pouvez voir une liste complète des signes Unicode

pour échapper au symbole pour cent, vous avez juste besoin %%

par exemple:

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

renvoie "10%"

Pas exactement votre problème, mais un semblable.

Si vous avez plus d'un formatage dans l'entrée de votre chaîne, vous ne devriez pas utiliser « % de » plusieurs fois.

DO NOT:

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

DO:

<string name="entry">Planned time %1$s - %2$s (%3$s)</string>

Vous pouvez échapper à la% en XML avec %%, mais vous devez définir le texte dans le code, pas dans la mise en page XML.

Cela pourrait être un cas de l'IDE devient trop stricte.

L'idée est bonne, en général, vous devez spécifier l'ordre des variables de substitution afin que si vous ajouter des ressources pour une autre langue, votre code Java ne sera pas besoin d'être changé. Cependant, il y a deux problèmes avec ceci:

Tout d'abord, une chaîne telle que:

You will need %.5G %s

à utiliser comme Vous aurez besoin 2,1200 mg aura l'ordre même dans toutes les langues que cette quantité de masse est toujours représentée dans cet ordre scientifique.

La seconde est que si vous mettez l'ordre des variables dans ce que jamais la langue de vos ressources par défaut sont spécifiées dans (par exemple l'anglais), alors vous ne devez spécifier que les positions dans les chaînes de ressources pour les langues de l'utilisation d'un autre ordre à votre défaut langue.

Les bonnes nouvelles sont que c'est simple à corriger. Même si il n'y a pas besoin de préciser les positions et l'IDE est d'être trop stricte, il suffit de les spécifier quand même. Pour l'exemple ci-dessus l'utilisation:

  

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

Essayez celui-ci (à droite):

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

Un procédé délicat: en utilisant signe petit pour cent comme ci-dessous

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

signe de pourcentage sur Wikipedia

Par google documentation officielle, utilisez% 1 $ s et% 2 $ s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Bonjour,% 1 $ s! Vous avez% 2 $ d de nouveaux messages.

Supposons que vous voulez afficher (50% OFF) et entrez 50 lors de l'exécution. Voici le code:

<string name="format_discount"> (
<xliff:g id="discount">%1$s</xliff:g>
<xliff:g id="percentage_sign">%2$s</xliff:g>
 OFF)</string>

Dans l'utilisation de classe Java ce code:

String formattedString=String.format(context.getString(R.string.format_discount),discountString,"%");
holder1.mTextViewDiscount.setText(formattedString);

Essayez d'utiliser une barre oblique inverse devant elle, comme ci-dessous:

\%
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top