Android学习之输出HTML格式下的文字方法详解

Android开发中,我们经常会用到TextView这个控件,在使用的过程中,我们用到最多的方法就是setText(),单纯的使用基本上能够满足我们日常的需求,但是有时候我们需要对文字进行一些处理,比如说加粗、斜体、下划线等等,这些也都是可以通过Android提供的原生方法完成。但是如果我们需要实现下面的效果呢:

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)));

运行程序,结果如下:

并没有出现我们预期的效果,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即可。

时间: 2025-01-09 13:47:35

Android学习之输出HTML格式下的文字方法详解的相关文章

Android ActionBar 关于tab的应用 以及 TabListener的方法详解

actionBar的tab标签应用以及TabListener的方法详解 package com.example.actionBarTest.actionBarTab; import android.app.*; import android.os.Bundle; import com.example.actionBarTest.R; import java.util.ArrayList; import java.util.List; /** * Created by Heyiyong on 20

Android学习之基础知识二(build.gradle文件详解)

一.详解build.gradle文件 1.Android Studio是采用Gradle来创建项目的,Gradle是非常先进的构建的项目的工具,基于Groovy领域特定的语言(DSL)来声明项目配置,摒弃了传统基于XML(如Ant.Maven)的各种烦琐的配置. 2.Android项目中存在两个build.gradle文件,一个在外层,一个在app中: A.外层的build.gradle文件:当需要添加全局的项目构建配置时才修改其中的内容 jcenter():代码托管仓库,存放Android开源

[转]Android调用so文件(C代码库)方法详解

一.为什么调用c的dll要用源码编译成so库 Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用. 二.安装 (I)安装cygwin 1.下载cygwincygwin可以在windows上虚拟unix编译环境,还内置了许多linux的编辑器等工具,可供选择安装.在本项目中cygwin主要用来编译生成so库.所以重在安装gcc.make包.到http://cygwin.com/setup.exe下载安装程序

学习python自动化运维之模块域名解析方法详解

1.MX #!/usr/bin/env python import dns.resolver domain = raw_input('please input an domain: ') MX = dns.resolver.query(domain, 'MX') for i in MX: print 'MX preference =', i.preference, 'mail exchanger =', i.exchange 2.NS #/usr/bin/env python import dn

CentOS VMware 下SSH配置方法详解

1.安装SSH[[email protected] ~]# yum install ssh2.启动SSH[[email protected] ~]# service sshd start3.设置开机运行[[email protected] ~]# chkconfig sshd on4.首先修改SSH的配置文件.如下: [[email protected] ~]# vi /etc/ssh/sshd_config ← 用vi打开SSH的配置文件 #Protocol 2,1 ← 找到此行将行头“#”删

Android进阶中级教程——1.1 Git的本地使用详解

Android进阶中级教程--1.1 Git的本地使用详解 标签(空格分隔): Android进阶 1.引言 在之前的Android基础入门系列我们就讲解过Git的简单使用了,进阶系列我们 系统地对Git进行讲解,基本命令的使用:工作区,暂存区,历史仓库,远程仓库的概念, 团队协作中的分支管理,Android Studio中使用Git等:Git是一个快速的分布式的版本 控制系统,和其他的版本控制系统的差别在于Git直接记录快照,而不是差异比较! 差异比较的版本控制系统只关心文件内容的具体差异,然

Android应用盈利广告平台的嵌入方法详解

一.如何学习Android   android开发(这里不提platform和底层驱动)你需要对Java有个良好的基础,一般我们用Eclipse作为开发工具.对于过多的具体知识详细介绍我这里不展开,我只说我个人的学习方法和本人以为的好的步骤.   1.搭建环境:包括对Java和Eclipse及模拟器(有真机再好不过)的熟悉,对于android的tools和adb命令可以放到后面熟悉了解.   2.从helloworld开始:了解一个基本的android应用代码包含哪些,各部分做什么用.(这里只要

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

Android基础入门教程——2.5.2 Notification(状态栏通知)详解

Android基础入门教程--2.5.2 Notification(状态栏通知)详解 标签(空格分隔): Android基础入门教程 本节引言: 本节带来的是Android中用于在状态栏显示通知信息的控件:Notification,相信大部分 学Android都对他都很熟悉,而网上很多关于Notification的使用教程都是基于2.x的,而 现在普遍的Android设备基本都在4.x以上,甚至是5.0以上的都有:他们各自的Notification 都是不一样的!而本节给大家讲解的是基于4.x以