优化实践---文本样式支持服务端配置方案

最近做到这样一个需求,服务端返回一段html文案,里面文字是部分可点击的,而且点击后需要跳转到h5页面。咋一听,感觉很简单呀,调用一下Html中的fromHtml方法不是分分钟解决了么。


初步尝试

以“<a href="www.baidu.com">百度<a>一下,你就<font color="#0099ff">知道</font>”为例:

出来的效果是这样的:

这里注意要给textView设置MovementMethod,如下所示:

textView.setMovementMethod(LinkMovementMethod.getInstance());

好了,现在百度两个字已经可以点击了,一点,确实可以跳转,不过跳到了系统自带的浏览器里。这里当然需要做一些处理,毕竟用户在你家App里用着用着,跳到系统的浏览器去了,势必会影响后面的流程。


直观的方案

那么这里该如何来处理呢,首先想到的一个方案就是,既然系统默认会跳转到自带的浏览器,那我们索性不用fromHtml方法了,直接将Html中的各个标签解析处理,再通过SpannableString设置对应处的点击事件和颜色颜色样式就好了。但是这样做的话开发成本很大,首先要做标签的解析,标签有平行的层级还有嵌套的层级,解析起来可就复杂了。


能否通过截获点击事件来做处理

上面讲到过,如果不给textView设置MoveMentMethod,那么html文本中的链接点击将不会生效,这时我们再给这个textView设置点击效果就好啦(跳转链接从html中用正则表达式解析出来),但这个方案有两个问题:1.现在文本是整个可点击了,而不是局部可点击(ui大佬要跑来和我撕b了);2.如果文本中有多个地方需要跳转不同链接这种方案也实现不了


寻找新思路

在搜索资料后发现,textView设置html样式时将点击样式解析成了URLSpan,而URLSpan设置的默认效果是打开系统浏览器。这个默认效果我暂时没想到方法修改,但是可以从这个URLSpan中获取链接,然后创建一个ClickableSpan来处理点击效果(这些Span是SpannableString中用来设置各种局部效果的),然后将原来的URLSpan效果去除,这样就可以自定义点击效果啦~

代码如下:

这里自定义了ClickableSpan,去除了默认的下滑线效果。

还有一个要注意的地方是textView必须设置MovementMethod,不然从textView中获取的文本就不是Spannable类型的,无法进行后续的处理。

好了,现在只要修改ClickableCallback接口的onClickableCallback方法的实现就可以自定义点击以后的逻辑啦,大功告成~

拿个例子测试一下:

<a href = "http://www.baidu.com/"><font color = "#ff6699">百度</font></a>......<a href = "http://www.soso.com/"><font color = "#0099ff">搜狗</font></a>

效果如下:


这样一来,文本内容、颜色和链接都可以由服务端控制啦,上线以后想调整就很方便了,不用再等客户端下次发版!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,498评论 0 17
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,790评论 1 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,983评论 25 708
  • 前段时间在开发群里看到有人问android的TextView该如何自定义超链接的跳转,如:有字符串“使用该软件,即...
    zhangjinhuang阅读 7,277评论 1 36
  • 泪珠 是琥珀的心声 晶莹的剔透 只为反射你的瞳眸 其实我只是一只小虫 挣扎不过命运的捉弄 蓝天碧草下的追逐 只在梦...
    暧微旸阅读 400评论 2 2