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

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


初步尝试

以“百度一下,你就知道”为例:

出来的效果是这样的:

这里注意要给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方法的实现就可以自定义点击以后的逻辑啦,大功告成~

拿个例子测试一下:

百度......搜狗

效果如下:


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

你可能感兴趣的:(优化实践---文本样式支持服务端配置方案)