2011-11-17 12 views
12

Nella mia app, mi piacerebbe definire una stringa di formato in strings.xml che assomiglia a questo (notare le <b>...</b> tag):Come posso utilizzare gli stili html nelle stringhe con gli argomenti di formattazione?

<string name="location"><b>Location:</b> %1$s</string> 

e quindi utilizzare getString(int, Object...) per sostituire in un argomento format:

String formattedString = getString(R.string.location, "Edmonton, AB"); 

Questo produce un valore di "Location: Edmonton, AB". Mi piacerebbe ottenere un valore di "<b>Location:</b> Edmonton, AB".

C'è un modo per farlo usando i formati di stringa in strings.xml senza dividerlo in due stringhe?

risposta

17

Dal docs:

A volte può essere utile creare una risorsa di testo in stile che è anche usato come una stringa di formato. Normalmente, questo non funziona perché il metodo String.format (String, Object ...) rimuove tutte le informazioni dallo stile dalla stringa. Per ovviare a questo problema, è necessario scrivere i tag HTML con entità in escape, che vengono quindi ripristinati con fromHtml (String), dopo la formattazione.

Ad esempio:

<resources> 
    <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string> 
</resources> 

Assicurarsi di sfuggire il testo che si sta passando in String.format()

String escapedUsername = TextUtils.htmlEncode(username); 
Resources res = getResources(); 
String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount); 
CharSequence styledText = Html.fromHtml(text); 
+0

Grazie, non sono sicuro di come mi sia perso nei documenti! – Greg

+0

@GregInYEG - Succede al meglio di noi. Il piacere è tutto mio. –

+0

Basta essere consapevoli del fatto che il metodo TextUtils.htmlEncode() non sostituisce '' (spazio) con ' '. Questo è causa di problemi nel mio caso (sto usando mailto: collegamento ipertestuale con parametri soggetto e corpo). Altrimenti la soluzione sopra funziona alla grande. – pepan

1

Utilizzare String.Format. per esempio.

<string name="location"><![CDATA[<b>Location:</b> %s]]></string> 

String formattedString = String.Format(getString(R.string.location), "Edmonton, AB"); 
+0

La stringa nel tuo esempio non contiene stili. In caso affermativo, la chiamata a getString (R.string.location) li eliminerebbe. – Greg

+0

Pensavo che il punto fosse formattare una stringa che è il mio esempio. Aggiungi i caratteri di formato come parametri extra al metodo di formattazione. – Kuffs

+0

String.format (getString (R.string.location), "Edmonton, AB") restituisce la stessa cosa di getString (R.string.location, "Edmonton, AB"). Né conservare stili come ... nella stringa da strings.xml. @ La risposta di iPaulPro punta alla documentazione di Android che spiega se voglio usare sia gli stili sia gli argomenti di formattazione, ho bisogno di sfuggire agli stili e usare Html.fromHtml (...). – Greg

Problemi correlati