Android中輸出HTML格式下的文字

ri6655 8年前發布 | 25K 次閱讀 HTML 安卓開發 Android開發 移動開發

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

導致錯誤的可能原因及解決方法:

  1. string.xml中的字符串中有 % ,對 % 進行轉義,即改為 \% ;或者使用兩個百分號表示一個,即改為 %% 。

  2. string.xml中的字符串被格式化了,導致解析器解析出錯,解決辦法為 <string name="test_string" formatted="false"> ,將formatted設置為false即可。

 

來自:http://www.jianshu.com/p/986e8e99636c

 

 本文由用戶 ri6655 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!