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

导致错误的可能原因及解决方法:

  1. string.xml中的字符串中有%,对%进行转义,即改为\%;或者使用两个百分号表示一个,即改为%%
  2. string.xml中的字符串被格式化了,导致解析器解析出错,解决办法为<string name="test_string" formatted="false">,将formatted设置为false即可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容