Android富文本展示

详情内容主要是图文和链接形式,推送给客户端后需要在APP内进行展示,移动端富文本的实现技术后大致分为原生实现和webview实现两种,下面分别对两种技术各自的特点和实现进行简要介绍。

原生实现-动态生成TextView和ImageView

获取到详情数据后根据文字和图片的具体数量和相对位置动态生成textview和imageview展示这些内容。缺点是需要在内容解析上花费大量精力,可支持的内容形式也比较有限。除非是非常简单的场景,这种方式一般不会采用。

原生实现-SpannableString

利用TextView对SpannableString的支持,将HTML文本解析,转化为SpannableString后进行展示,优点是安卓SDK中已经提供了相关的工具,即Html类,免去了手动解析的工作,并且具有原生性能,缺点是支持的内容形式比较优先,而且如果内容较多,Html.fromhtml()也相应会比较耗时。

支持的内容标签:

  • 字体:<font>,颜色(color)、字体(face)、字体样式:粗体、斜体、下划线,但不支持大小(size),但可以自定义Html.TagHandler以实现对文字大小的支持;
  • 列表:<ul><li>
  • 图片:<img>
  • 其他:<div><span><strong><b><em><cite><dfn><i><big><small><blockquote><tt><p><a><u><del><s><strike><sup><sub><h><br>

为了方便使用者拓展,提供了Html.TagHandler接口,由用户自己解析处理HTML标签。上述标签已经涵盖了多数简单的需求场景,如果有能力通过Html.TagHandler几乎可以实现任何SpannableString的能力。如果不想自行定义标签解析器,也有一些第三方的库可以提供支持。

第三方库:

  • HtmlSpanner:增加了更多标签的支持,免去自定义tag解析器的麻烦。

采用原生的方式,归根结底取决于SpannableString的能力,SpannableString无法实现的需求这条技术方案就只能被迫放弃。

WebView实现

采用WebView实现富文本展示可以说是能力支持最全的了,其充分利用了移动web端已有的能力,只需简单处理甚至不用额外处理就可以实现对富文本的支持。

支持的内容标签:

  • 几乎所有的html标签,包括视频、图片、表格等

核心方法:

// 加载富文本内容
webView.loadData(htmlStr, "text/html", "UTF-8");//中文可能乱码
webView.loadDataWithBaseURL(null, htmlStr, "text/html", "UTF-8", null);//推荐

其他常见配置:

webView.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);//取消滚动条
webView.getSettings().setSupportZoom(false);//不支持缩放功能

图片宽度适应屏幕:

// jsoup 修改 img 的属性:
final Document doc = Jsoup.parse(htmltext);

final Elements imgs = doc.getElementsByTag("img");
for (int i = 0; i < imgs.size(); i++) {
   	//宽度填充手机,高度自适应
   	//这里优化的方向为先判断图片原本的大小,达到阈值才进行图片大小适配
	imgs.get(finalI).attr("style", "width: 100%; height: auto;");
}

视频宽度适应屏幕:

// jsoup 修改 embed 的属性:
Elements embeds = doc.getElementsByTag("embed");
for (Element element : embeds) {
    //宽度填充手机,高度自适应
    element.attr("width", "100%").attr("height", "auto");
}

//webview 无法正确识别 embed 为视频,把这个标签改成 video
doc.select("embed").tagName("video");

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值