Android TextView 添加<a>标签的点击事件

本文介绍如何在Android应用中自定义HTML文本中的链接点击行为,通过使用SpannableString和ClickableSpan实现对特定链接的拦截与定制响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 有时候我们需要在一些消息里面带有 可以点击的链接,我们可以用下面的方法拦截链接的点击事件,如果不进行拦截,点击textView里面的链接就会直接跳到外部浏览器打开链接。

搞懂里面的原理要先了解SpannableString 这个类的用法,可以参考  用SpannableString打造绚丽多彩的文本显示效果 

懂了SpannableString之后除了下面代码的功能外,还可以自定义更多的效果和功能。


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

public class HtmlActivity extends AppCompatActivity {

    private TextView tvTit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_html);

        tvTit =findViewById(R.id.tit) ;

        setInitTvTit(tvTit);
    }
    private void setInitTvTit(TextView tvTit){

        String html="\n" +
                "<font color=\"#222222\">欢迎使用小游戏APP。在您使用本APP前,请仔细阅读<font color=\"#FF9800\"><a href= \"https://baidu.com/agreement.html\">《用户协议》</a ></font>和<font color=\"#FF9800\"><a href=\"tel:10086\">10086</a ></font>的全部内容,同意并接受全部条款后开始使用我们的产品和服务。我们会严格按照政策内容使用和保护您的个人信息,感谢您的信任。<br/><br/>若您同意以上用户协议和隐私协议保护政策,请点击“同意”并开始使用我们的产品和服务。</font>";

        tvTit.setText(getClickableHtml(Html.fromHtml(html)));
        tvTit.setMovementMethod(LinkMovementMethod.getInstance());
        tvTit.setHighlightColor(Color.TRANSPARENT);

    }

    private void setLinkClickable(final SpannableStringBuilder clickableHtmlBuilder, final URLSpan urlSpan) {
        int start = clickableHtmlBuilder.getSpanStart(urlSpan);
        int end = clickableHtmlBuilder.getSpanEnd(urlSpan);
        int flags = clickableHtmlBuilder.getSpanFlags(urlSpan);

        Log.e("HtmlActivity :","start : "+start+" end :"+end+" flags :"+flags);

        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(false);
            }

            @Override
            public void onClick(View widget) {
                String originUrl = urlSpan.getURL();//获取url地址
                //do something
                Toast.makeText(HtmlActivity.this,originUrl,Toast.LENGTH_SHORT).show();
                Log.i("HtmlActivity :","originUrl : "+originUrl);
            }
        };
        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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值