2011-11-17 14 views
12

W moim app, chciałbym zdefiniować ciąg formatu w strings.xml który wygląda tak (uwaga na <b>...</b> tagów):Jak używać stylów html w ciągach znaków z argumentami formatowania?

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

a następnie użyć getString(int, Object...) zastąpił w formacie argumentu:

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

Daje to wartość "Location: Edmonton, AB". Chciałbym uzyskać wartość "<b>Location:</b> Edmonton, AB".

Czy jest jakiś sposób zrobienia tego przy użyciu formatów ciągów w pliku strings.xml bez dzielenia go na dwa ciągi?

Odpowiedz

17

Z docs:

Czasami może chcesz stworzyć stylizowany zasób tekstowy, który jest również używany jako ciąg formatu. Zwykle nie zadziała to, ponieważ metoda String.format (String, Object ...) usunie z łańcucha wszystkie informacje o stylu. Rozwiązaniem tego problemu jest napisanie znaczników HTML ze zmienionymi jednostkami, które są następnie odzyskiwane z zHtml (String), po sformatowaniu.

Na przykład:

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

Upewnij się uciec tekst jesteś przejazdem w 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

Dzięki, nie wiem, jak to przegapiłem w dokumentach! – Greg

+0

@GregInYEG - Dzieje się z najlepszymi z nas. Moja przyjemność. –

+0

Należy pamiętać, że metoda TextUtils.htmlEncode() nie zastępuje "'(spacja)"   ". To powoduje problemy w moim przypadku (używam mailto: hiperlink z parametrami podmiotu i treści). W przeciwnym razie powyższe rozwiązanie działa świetnie. – pepan

1

Użyj String.Format. na przykład

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

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

ciąg w swoim przykładzie nie zawiera style. Jeśli tak, wywołanie getString (R.string.location) usunie je. – Greg

+0

Myślałem, że chodzi o sformatowanie ciągu znaków, który jest tym, co robi mój przykład. Dodaj znaki w formacie jako dodatkowe parametry do metody formatowania. – Kuffs

+0

String.format (getString (R.string.location), "Edmonton, AB") zwraca to samo, co getString (R.string.location, "Edmonton, AB"). Nie przechowuj stylów takich jak ... w ciągu znaków z pliku strings.xml. Odpowiedź @ iPaulPro wskazuje na dokumentację Androida, która wyjaśnia, czy chcę używać zarówno stylów, jak i argumentów formatowania, muszę uciec od stylów i użyć Html.fromHtml (...). – Greg

Powiązane problemy