捕获Android文本中链接点击事件

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,如浏览器。

如果我们想拦截点解事件,跳转到我们指定的页面,或做些其他的逻辑,该怎么做?

  1. 获取html类型的Spanned
  String url = "<a href=\"http://baidu.com\">百度</a>";
  Spanned spannedHtml=Html.fromHtml(url);
  1. 关键实现:
    实现原理就是将所有的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就是默认情况,没有超链接

猜你喜欢

转载自blog.csdn.net/u011118524/article/details/93738466
今日推荐