TextView显示Html超链接常规用法
TextView myTextView = (TextView)findViewById(R.id.myTextView);
String url = "<a href=\"http://baidu.com\">百度</a>";
myTextView.setText(Html.fromHtml(url));
// 这个必须设置,否则超链接点解没有效果
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
拦截超链接的点击事件
上面的操作,点击超链接的时候,系统会封装成Intent:Intent { act=android.intent.action.VIEW dat=http://baidu.com (has extras) }
系统就会去找action为android.intent.action.VIEW,data协议为http的activity,如浏览器。
如果我们想拦截点解事件,跳转到我们指定的页面,或做些其他的逻辑,该怎么做?
- 获取html类型的Spanned
String url = "<a href=\"http://baidu.com\">百度</a>";
Spanned spannedHtml=Html.fromHtml(url);
- 关键实现:
实现原理就是将所有的URL设置成ClickSpan,然后在它的onClick事件中加入你想要的控制逻辑就可以了。
private void setLinkClickable(final SpannableStringBuilder clickableHtmlBuilder,
final URLSpan urlSpan) {
int start = clickableHtmlBuilder.getSpanStart(urlSpan);
int end = clickableHtmlBuilder.getSpanEnd(urlSpan);
int flags = clickableHtmlBuilder.getSpanFlags(urlSpan);
ClickableSpan clickableSpan = new ClickableSpan() {
public void onClick(View view) {
//Do something with URL here.
// 如获取url地址,跳转到自己指定的页面
}
};
clickableHtmlBuilder.setSpan(clickableSpan, start, end, flags);
}
private CharSequence getClickableHtml(Spanned spannedHtml) {
SpannableStringBuilder clickableHtmlBuilder = new SpannableStringBuilder(spannedHtml);
URLSpan[] urls = clickableHtmlBuilder.getSpans(0, spannedHtml.length(), URLSpan.class);
for(final URLSpan span : urls) {
setLinkClickable(clickableHtmlBuilder, span);
}
return clickableHtmlBuilder;
}
3.把设置好clickSpan的html数据,设置到TextView中:
myTextView.setText(getClickableHtml(url));
// 设置超链接可点击
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
4.最后设置TextView的autoLink属性:
如果没有设置autoLink属性,无法拦截超链接的点击事件,亲测。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:id="@+id/myTextView"
android:autoLink="web" //
/>
注意:
autoLink:一共有以下几种值:web,phone,map,email,all,none。
分别是:url连接,电话号码提取拨号,地图地址,电子邮件,全部解释就是能支持的超级连接全部起作用,none就是默认情况,没有超链接