Simbolo percentuale XML Android


309

Ho una serie di stringhe in cui %viene utilizzato il simbolo. Formato corretto per l'utilizzo di %is %. Quando ho una stringa in quell'array con più %mi dà questo errore.

 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
Puoi pubblicare l'XML che causa questo errore? Può essere molto difficile identificare un problema senza vederne la causa.
Chris Cashwell,

questo è un errore che può essere facilmente replicato da qualsiasi stringa con 2 o più simboli%.
zaid

Se non cerchi uno scopo di formattazione, un modo migliore per farlo.
Shishir Gupta,

Nel mio caso, ho erroneamente inserito il parametro di formattazione come 1% $ s, anziché% 1 $ s.
Ashokchakravarthi Nagarajan,

Risposte:


467

Android Asset Packaging Tool ( aapt) è diventato molto rigoroso nella sua ultima versione ed è ora utilizzato per tutte le versioni di Android. L'errore aapt che ricevi viene generato perché non consente più gli identificatori di formato non posizionali .

Ecco alcune idee su come includere il simbolo% nelle stringhe di risorse.

Se non hai bisogno di identificatori o sostituzioni di formato nella tua stringa, puoi semplicemente utilizzare l' formattedattributo e impostarlo su false:

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

In questo caso la stringa non viene utilizzata come stringa di formato per il Formatterquindi non è necessario sfuggire ai simboli%. La stringa risultante è "% a +% a == 2% a".

Se si omette l' formatted="false"attributo, la stringa viene utilizzata come stringa di formato e si deve sfuggire ai simboli%. Questo è fatto correttamente con il doppio%:

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

Ora aaptnon ti dà errori ma a seconda di come la usi, la stringa risultante può essere "%% a + %% a == 2 %% a" se a Formatterviene invocato senza argomenti di formato :

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"

Senza xml e codice è difficile dire quale sia esattamente il tuo problema, ma spero che questo ti aiuti a capire meglio i meccanismi.


1
ho selezionato questa come risposta perché dovrebbe funzionare, ma a quanto pare c'è un bug che sto incontrando con quella stringa, quindi ho deciso di usare %% e "XXX.replaceAll (" %% ","% ");"
zaid

4
usando formatted = false funziona bene. È così che l'ho usato: <string name = "information_description" formatted = "false"> \ 'Sweet \' Dal 10% al 20% anche del 35% di zucchero in peso </string>
Qualcuno da qualche parte

1
formatted = false funziona bene anche per me. Usando %%, è apparso letteralmente come %% sul mio dispositivo ed emulatore ..
samwize

formatted = false ha funzionato bene per me in passato. ora (ADT 22), per qualche ragione no. e se uso: "str = mContext.getString (R.string.str," hello ")", avrà questo avviso lanugine: "La stringa di formato 'str' non è una stringa di formato valida, quindi non deve essere passata a String.format "
sviluppatore Android

1
Se si accede da <string-array />, per la stampa percentuale utilizzare \ u0025. Questo ha funzionato per me.
Chintan Shah,

157

Per consentire all'app di utilizzare stringhe formattate da risorse, è necessario correggere il proprio XML. Quindi, per esempio

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

dovrebbe essere sostituito con

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

Puoi vedere questo per i dettagli.


2
Grazie, hai fornito il link mancante - letteralmente.
akauppi,

22
Per la sostituzione di più parametri (ad es. Con stringhe), utilizzare %1$s, %2$secc.
CJBS

1
chi leggerà una risposta così grande per questa piccola cosa? Grazie, scorro verso il basso per trovarti.
Janaka R Rajapaksha,

73

È possibile uscire da% utilizzando %% per il parser XML, ma viene mostrato due volte nel dispositivo.

Per mostrarlo una volta, prova il seguente formato: \%%

Per esempio

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

è mostrato come Fat Burning (50% to 60%)nel dispositivo


6
\ %% provoca arresti anomali su Nexus 4 4.2.1. Non ho provato altri.
Jon Willis,

Funziona bene ed è facile quando conosci già la percentuale che vuoi includere nelle tue stringhe, rispetto all'uso del formattatore di stringhe e alla necessità di impostare sempre quei valori codificati programmaticamente.
portfoliobuilder

Questo è andato in crash anche per me su Nexus 5.1.1. La risposta di @ViliusK è quella corretta.
Chan Jing Hong,

2
basta usare %% invece di%
Sundeep1501

37

Uso

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

ottenere

80% wins come stringa formattata.

Sto usando il String.format()metodo per ottenere il numero inserito invece di %d.


12

Nel tuo file strings.xml puoi usare qualsiasi segno Unicode che desideri.

Ad esempio, il numero Unicode per il segno di percentuale è 0025:

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

Puoi vedere un elenco completo dei segni Unicode qui


1
Questo non ha alcun senso. & # x0025; e% sono identici in un file xml.
BeniBela,

Il file di risorse viene convertito in una risorsa Java e, in tal modo, il %carattere ritorna. Temo che questo non risolva il problema.
Paul Lammertsma,

9

per sfuggire al simbolo percentuale, devi solo %%

per esempio :

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

restituisce "10%"


1
La tua risposta è praticamente la stessa di molte altre risposte esistenti
Ben Rhys-Lewis,

... e sbagliato, perché 10%non ritorna %10. FIY: quando lo usi String.formatdovresti sempre specificare Locale. Puoi essere davvero sorpreso quando non metti Locale e usi le
impostazioni

7

Non esattamente il tuo problema ma uno simile.

Se nella tua stringa hai più di una formattazione, non dovresti usare "% s" più volte.

NON:

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

FARE :

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

5

Puoi sfuggire a% in xml con %%, ma devi impostare il testo nel codice, non nel layout xml.


1
Sì, sfugge al doppio% e si compila bene. Ma quando eseguito su emulatore o anche su dispositivi, potrebbe apparire come %%.
Samwize,

5

Questo potrebbe essere un caso in cui l'IDE diventa troppo severo.

L'idea è valida, in generale è necessario specificare l'ordine delle variabili di sostituzione in modo che se si aggiungono risorse per un'altra lingua, il codice Java non dovrà essere modificato. Tuttavia ci sono due problemi con questo:

Innanzitutto, una stringa come:

You will need %.5G %s

per essere usato in quanto avrai bisogno di 2.1200 mg avrà lo stesso ordine in qualsiasi lingua in quanto tale quantità di massa è sempre rappresentata scientificamente in quell'ordine.

Il secondo è che se metti l'ordine delle variabili in qualsiasi lingua in cui sono specificate le tue risorse predefinite (es. Inglese), devi solo specificare le posizioni nelle stringhe di risorse per le lingue per usare un ordine diverso dalla tua lingua predefinita.

La buona notizia è che questo è semplice da risolvere. Anche se non è necessario specificare le posizioni e l'IDE è eccessivamente rigoroso, basta specificarle comunque. Per l'esempio sopra utilizzare:

Avrai bisogno di% 1 $ .5G% 2 $ s



3

Prova questo (giusto):

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


-1

Supponiamo di voler mostrare (SCONTO DEL 50%) e inserire 50 in fase di esecuzione. Ecco il codice:

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

Nella classe java usa questo codice:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.