Android中輸出HTML格式下的文字
Android中輸出HTML格式下的文字
在Android中,我們經常會用到TextView這個控件,在使用的過程中,我們用到最多的方法就是setText(),單純的使用基本上能夠滿足我們日常的需求,但是有時候我們需要對文字進行一些處理,比如說加粗、斜體、下劃線等等,這些也都是可以通過Android提供的原生方法完成。但是如果我們需要實現下面的效果呢:
圖1
HTML下的文字解析(快速版)
從圖片上我們可以看到,這段文字分別有 兩種大小,三種顏色 。我們當然可以定義多個TextView來實現這樣的效果,但是如果我們的文字變化較多,那么定義多個TextView也非常的麻煩。那么接下來我們就來介紹一個比較簡單的方法:
String str = "恭喜您!您的手機跑分為<font color='#F50057'><big><big><big>888888分</big></big></big></font>,已經超過全國<font color='#00E676'><big><big><big>99%</big></big></big></font>的Android手機。";
tv.setText(Html.fromHtml(str));
上面的代碼中,我們用到了一個方法 Html.fromHtml() ,這個方法是Android中專門用來解析HTML格式的一個方法,我們可以將任意的HTML格式下的代碼通過此方法解析,最后得到我們需要的結果。
通過上面的方法,我們就可以實現在 setText() 中使用各種帶HTML效果的文字了。這樣應該能夠實現我們開發中98%的需求了,那么還有1-2%的需求是什么呢?
HTML下的文字解析(多語言支持)
比如說我們現在的APP需要兼容多種語言,包括中文、法語、英語、日語等等。在平時的開發過程中,我們都知道多語言的實現可以通過不同 values 文件夾下的 string.xml 文件來實現。我們這里就以中文來舉例,看看我們如何在 string.xml 文件中定義HTML格式的文字。
首先我們來嘗試將我們上面定義的 str 中的字符串直接放到 string.xml 中。
<string name="test_string">
恭喜您!您的手機跑分為<font color='#F50057'><big><big><big>888888分</big></big></big></font>
,已經超過全國<font color='#00E676'><big><big><big>99%</big></big></big></font>的Android手機。
</string>
tv.setText(Html.fromHtml(getString(R.string.test_string)));
運行程序,結果如下:
圖2
并沒有出現我們預期的效果,HTML格式并沒有被解析出來。這是什么原因呢?原因就在于我們使用的 getString() 方法,官方對于這個方法的解釋如下:
Return the string value associated with a particular resource ID. It will be stripped of any styled text information.
返回與特定資源ID相關聯的字符串值,它將刪除任何樣式的文本信息。
那么也就是說我們的HTML格式被 getString() 方法給刪除了,所以我們的文字才會變成普通的字符串。要解決這個問題,我們需要將我們的 string.xml 中的字符串使用 <![CDATA[...your html...]]> 包裹起來,被 CDATA 包裹起來的字符都會被解析器忽略,也就是說 CDATA 中的HTML格式將會被原封不動的保留下來,最終交給我們的 Html.fromHtml() 進行解析。那么我們來嘗試以下,將我們 string.xml 中的字符串改為如下:
<string name="test_string">
<![CDATA[
恭喜您!您的手機跑分為<font color='#F50057'><big><big><big>888888分</big></big></big></font>
,已經超過全國<font color='#00E676'><big><big><big>99%</big></big></big></font>的Android手機。
]]>
</string>
編譯運行,結果編譯時報錯:
Error:(17, 5) Apostrophe not preceded by \ (in 鎭枩鎮紒鎮ㄧ殑鎵嬫満璺戝垎涓?<font color='#F50057'><big><big><big>888888鍒?</big></big></big></font>
報錯的關鍵詞為:
Apostrophe not preceded by \
撇號前面沒有\
通過上面的這個報錯信息我們可以知道,這是因為 ' 沒有進行轉義,那么我根據報錯信息將所有的單引號進行轉義。最后的結果如下:
<string name="test_string">
<![CDATA[
恭喜您!您的手機跑分為<font color=\'#F50057\'><big><big><big>888888分</big></big></big></font>
,已經超過全國<font color=\'#00E676\'><big><big><big>99%</big></big></big></font>的Android手機。
]]>
</string>
最后我們再次運行,得到的就是和我們文章開頭一樣的結果。
關于Android中HTML格式下的文字解析大概就是這樣了,如果大家還有其他的方法,歡迎交流。
后記
最后附上一個在嘗試過程中遇到的錯誤,本來想情景重現的,結果怎么樣都無法再遇到那個錯誤了。如果有遇到這個錯誤的朋友,可以嘗試下面的解決辦法。
錯誤:
Multiple annotations found at this line:
-
error: Multiple substitutions specified in non-positional format; did you mean to add
the formatted="false" attribute? -
error: Unexpected end tag string
導致錯誤的可能原因及解決方法:
-
string.xml中的字符串中有 % ,對 % 進行轉義,即改為 \% ;或者使用兩個百分號表示一個,即改為 %% 。
-
string.xml中的字符串被格式化了,導致解析器解析出錯,解決辦法為 <string name="test_string" formatted="false"> ,將formatted設置為false即可。
來自:http://www.jianshu.com/p/986e8e99636c