Android使用内置使用内置WebView打开打开TextView超链接的实现方法超链接的实现方法
主要介绍了Android使用内置WebView打开TextView超链接的实现方法,文中给出了详细的示例代码,对各位Android开发者们具有
一定的参考价值,需要的朋友们下面来一起看看吧。
需求原因需求原因
最近工作中遇到一个需求,后来通过查找相关的资料终于解决了,索性记录下来分享给大家,需要的朋友们可以参考学习。
该需求如下:该需求如下:
**产品说,我们要实现问答功能,答案内的链接要使用内置的浏览器打开。
**视觉说,我们要给超链接标上我们自己的颜色。
如图:如图:
下面我们分析下如何实现。
使用使用Html
常规方法,给定一段标准html文档,使用Html.fromHtml()封装,直接使用TextView显示。
TextView textView = (TextView) findViewById(R.id.detailed_question_tv_answer);
String testString =
"亲,一般遇到这问题您可以这样哦:<br>1.可以<font color='#ff8785'><a href='http://m.kaola.com'>催发货</a></font>哦~<br>2.然后耐心等待哦~<br>3.1-3天后新也可以拨打我们的客服.";
textView.setMovementMethod(LinkMovementMethod.getInstance());
// 设置链接颜色
textView.setLinkTextColor(getResources().getColor(R.color.red_ff8785));
Spanned htmlString = Html.fromHtml(testString);
textView.setText(htmlString);
使用常规方法无论怎么设置,链接都会使用隐式Intent打开,即使用外部的浏览器打开,不符合咱们产品的需求呀。怎么才能监听这个使用并使用内
部WebView打开呢?使用SpannableStringBuilder。
使用使用SpannableStringBuilder
直接上代码。
TextView textView = (TextView) findViewById(R.id.detailed_question_tv_answer);
String testString =
"亲,一般遇到这问题您可以这样哦:<br>1.可以<font color='#ff8785'><a href='http://m.kaola.com'>催发货</a></font>哦~<br>2.然后耐心等待哦~<br>3.1-3天后新也可以拨打我们的客服.";
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setLinkTextColor(getResources().getColor(R.color.red_ff8785));
String linkText = "催发货";
int startIndexOfLink = testString.indexOf(linkText);
int endIndexOfLink = startIndexOfLink + linkText.length();
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(testString);
spannableStringBuilder.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
ActivityUtils.startWebviewActivity(DetailedQuestionActivity.this, "http://m.kaola.com", false);
}
}, startIndexOfLink, endIndexOfLink, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableStringBuilder);
当然,这个方法是有很大的局限性的,必须知道链接在文案中的具体位置,以及链接的地址才能够使用这种方法。按照这种思路,我们必须使用正则
表达式获取对应的a标签才能得到链接。这种方法拿到的链接在文案中的具体位置是难以把握的,很有可能出错。
Html + SpannableStringBuilder
有没有第三种方法,即能够解析到给定文案中的所有Html标签,又能够使用内置的WebView打开这个链接?从第一种方法中,我们直接使
用Html.fromHtml()方法拿到对应的Spanned结果,我们可以从这里入手,看看这个方法是怎么解析html标签的
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
// 使用org.ccil.cowan.tagsoup.Parser作为解析器
Parser parser = new Parser();
try {
parser.setProperty(Parser.schemaProperty, HtmlParser.schema);
} catch (org.xml.sax.SAXNotRecognizedException e) {
// Should not happen.
throw new RuntimeException(e);
} catch (org.xml.sax.SAXNotSupportedException e) {
评论0
最新资源