最近在做一个需求,要求把服务端下发的内容以超链接文本形式展示,且需要从app内部的浏览器打开。
这个需求包含了以下需要实现的内容,让我们来看一看。
1 把服务端下发的String内容以超链接文本形式展示
服务端下发的内容String如下:
<a href="https://www.xxx.html">XXX</a>
String内容是一个HTML<a>标签。
熟悉android超链接文本处理的朋友应该知道可以通过Html类的fromHtml方法来把这个String解析成一个SpannableString,从而把这个SpannableString设置在TextView上就可以将服务器下发的内容展示成超文本链接并点击跳转了。
2 提取String内容里的url链接
第一步不难,但是要把这个链接从app内部的浏览器打开还是需要一些处理的。
想要在app内部打开链接,首先我们要知道链接是什么以及怎么获取到这个链接。
经过一番的网上查询以及实验,最终找到了获取url的方法。
TextView提供了一个getUrls()方法,这个方法返回了一个URLSpan数组。
而这个URLSpan数组就是如果当前TextView设置的内容是SpannableString,则这个数组里包含了这个String所有的URLSpan。(这部分是猜测出来的,没有经过太多验证。因为自己调试的时候测试数据只包含了一个URLSpan,一般场景也就配一个跳转链接)
所以提取url的方法就是
val url = textView.urls[0].url
这样就能把TextView的跳转链接获取到了。
3 设置点击事件为打开app内部浏览器
在给TextView设置超文本链接的Spanned之后,我们想要给TextView设置onClick事件,让它点击之后唤起app内部的网页浏览页面。
但是设置完onClick事件后,我们发现TextView点击后还是从手机系统的浏览器打开了链接。
反复查询之后发现原来设置SpannableString还会给TextView设置一个属性叫LinkMovementMethod.
如果不设置这个属性,之前的SpannableString是不会自动打开系统浏览器的。
设置之后它的优先级会比onClick事件要高。
所以如果设置完onClick事件后,发现还是从手机系统打开浏览器,要检查一下这个LinkMovementMethod是否设置。
我们直接在设置onClick前把MovementMethod设置为null即可。
textView.movementMethod = null
这样一来就可以通过onClick事件打开app内部的浏览器,把url作为参数,打开超链接文本的链接了。