Domanda

Ho un array di stringhe in cui viene utilizzato il simbolo %. formato corretto per l'utilizzo del % è %. Quando ho una stringa in tale matrice 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
È stato utile?

Soluzione

L'Asset Android Packaging Tool (aapt) è diventato molto severa nella sua ultima rilascio ed è ora utilizzato per tutti versioni di Android. L'aapt errore che stai ricevendo è generato perché non consente più identificatori di formato non posizionali .

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

Se non è necessario alcun identificatori di formato o sostituzioni di stringa si può semplicemente fare uso dell'attributo formatted e impostarlo false:

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

In questo caso la stringa non viene usato come stringa di formattazione per la Formatter in modo da non dover fuggire i tuoi% -Simboli. La stringa risultante è "% a +% a == 2%".

Se si omette l'attributo formatted="false", la stringa viene utilizzato come una stringa di formato e si deve sfuggire alle -Simboli%. Questo viene fatto in modo corretto con il doppio -%:

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

Ora aapt ti dà nessun errore, ma a seconda di come lo si utilizza, la stringa risultante può essere "%% a + %% a == 2 %% a" se un Formatter viene invocato senza alcun formato argomenti :

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 alcun XML e il codice è difficile dire che cosa esattamente il tuo problema, ma spero che questo ti aiuta a capire i meccanismi un po 'meglio.

Altri suggerimenti

Per consentire l'applicazione utilizzando stringhe formattate da risorse si dovrebbe correggere il vostro XML. Così, 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>

Si può vedere questo per i dettagli.

Si può sfuggire% utilizzando %% per parser XML, ma è mostrato due volte in un dispositivo.

Per vederlo una volta, provare seguente formato: \%%

Ad esempio

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

è indicato come Fat Burning (50% to 60%) dispositivo

Usa

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

per ottenere

80% wins come una stringa formattata.

Sto usando il metodo String.format() a ottenere il numero inserito al posto di %d.

Nel file strings.xml è possibile utilizzare qualsiasi Unicode segno che si desidera.

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

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

È possibile visualizzare un elenco completo di segni Unicode qui

per sfuggire il simbolo di percentuale, basta %%

Ad esempio:

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

restituisce "10%"

Non esattamente il tuo problema, ma uno simile.

Se si dispone di più di una formattazione nella vostra voce di stringa, non si dovrebbe usare "% s" più volte.

NON:

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

DO:

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

Si può sfuggire il% in xml con %%, ma è necessario impostare il testo in codice, non nel layout xml.

Questo potrebbe essere un caso di IDE diventare troppo rigida.

L'idea è sana, in generale, è necessario specificare l'ordine delle variabili di sostituzione in modo che si dovrebbe aggiungere le risorse per un'altra lingua, il codice Java non avrà bisogno di essere cambiato. Tuttavia ci sono due problemi con questo:

In primo luogo, una stringa come:

You will need %.5G %s

per essere utilizzato come Sarà necessario 2,1200 mg avrà l'ordine lo stesso in qualsiasi lingua come quella quantità di massa è sempre rappresentata in questo ordine scientificamente.

La seconda è che se si mette l'ordine delle variabili in che cosa mai lingua le risorse predefinite sono specificati in (ad esempio inglese) allora solo è necessario specificare le posizioni nelle stringhe di risorse per le lingue l'uso di un ordine diverso per predefinito lingua.

La buona notizia è che questo è semplice da risolvere. Anche se non v'è alcuna necessità di specificare le posizioni, e l'IDE è essere troppo rigida, basta specificare comunque. Per l'esempio precedente uso:

  

È necessario% 1 $ .5G% 2 $ s

Prova questo (a destra):

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

Un metodo ingannevole: usando piccolo segno per cento come di seguito

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

Segno di percentuali su Wikipedia

Per google documentazione ufficiale, l'uso% 1 $ s e% 2 $ s http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Ciao,% 1 $ s! Hai% 2 $ d nuovi messaggi.

Si supponga di voler mostrare (50% OFF) e immettere 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 di utilizzo di Java questo codice:

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

Provare a usare un backslash davanti ad esso, come di seguito:

\%
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top