2011-11-17 52 views
12

在我的應用程序,我想定義的strings.xml格式字符串,看起來像這樣(請注意<b>...</b>標籤):如何在帶格式參數的字符串中使用html樣式?

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

然後用getString(int, Object...)的格式參數來代替:

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

這產生一個值"Location: Edmonton, AB"。我想得到"<b>Location:</b> Edmonton, AB"的值。

是否有某種方式在strings.xml中使用字符串格式而不將它分成兩個字符串?

回答

17

docs

有時你可能需要創建一個樣式的文本資源,這也是作爲一個格式字符串 。通常,這不起作用,因爲 String.format(String,Object ...)方法將從字符串中去除所有樣式 信息。解決此問題的方法是將帶有轉義實體的HTML標記寫入 ,然後在格式化後使用 從HTML(字符串)中恢復。

例如:

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

確保逃脫你逝去的文字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

謝謝,不知道我是如何錯過文檔中的! – Greg

+0

@GregInYEG - 發生在我們身上。我的榮幸。 –

+0

只需注意TextUtils.htmlEncode()方法不會將''(空格)替換爲' '。這在我的情況下造成了麻煩(我正在使用mailto:主題和身體參數的超鏈接)。否則上述解決方案很好。 – pepan

1

使用String.Format。例如

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

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

在你的榜樣不包含風格的字符串。如果是這樣,調用getString(R.string.location)會將它們去掉。 – Greg

+0

我認爲重點是格式化一個字符串,這是我的例子。將格式字符作爲額外參數添加到格式方法中。 – Kuffs

+0

String.format(getString(R.string.location),「Edmonton,AB」)返回與getString(R.string.location,「Edmonton,AB」)相同的結果。在strings.xml中的字符串中不能保存...之類的樣式。 @ iPaulPro的答案指向瞭解釋我是否想使用樣式和格式參數的android文檔,我需要轉義樣式並使用Html.fromHtml(...)。 – Greg

相關問題