Android TextView 解析字符串中的多个超链接

1.1 业务需求

在Android 开发中,有时候需要解析后台返回的字符串的所有超链接,点击超链接可以打开网址。

1.2 解决方案

这里提供四种解决方案,切换测试解决方案只需要修改TEST_SORT 的值为1,2,3,4

package com.xingyun.myapplication;

import android.graphics.Color;
import android.os.Bundle;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.text.util.Linkify;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static final Integer TEST_SORT=4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView mTextView=this.findViewById(R.id.helloWorldTextView);

        switch (TEST_SORT){
            case 1:
                test1(mTextView);
                break;
            case 2:
                test2(mTextView);
                break;
            case 3:
                test3(mTextView);
                break;
            case 4:
                test4(mTextView);
            default:
                break;
        }
    }

    private void test1(TextView mTextView){
        String html = "有问题:\n";
        html += "<a href='http://www.baidu.com'>百度一下</a>";
        mTextView.setText(Html.fromHtml("<a href='tel:18565554482'>打电话</a>,<a href='smsto:18565554482'>发短信</a>,<a href='mailto:584991843@qq.com'>发邮件</a>,<a href='http://www.baidu.com'>Go百度</a>"));
        //设置该TextView为可点击状态
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    private void test2(TextView mTextView){
        String html = "http://www.baidu.com https://xingyun.blog.csdn.net";

         mTextView.setAutoLinkMask(Linkify.ALL);
        mTextView.setText(html);
    }

    private void test3(TextView mTextView){
        SpannableString ss = new SpannableString("打电话,发短信,发邮件,Go百度");
        ss.setSpan(new URLSpan("tel:18565554482"), 0, 3,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new URLSpan("smsto:18565554482"), 4, 7,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new URLSpan("mailto:584991843@qq.com"), 8, 11,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new URLSpan("http://www.baidu.com"), 12, 16,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //SpannableString对象设置给TextView
        mTextView.setText(ss);
         //设置TextView可点击
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    private void test4(TextView mTextView){
        SpannableString spannableString = new SpannableString("使用该软件,即表示您同意该软件的使用条款和隐私政策");
        //设置下划线文字
        spannableString.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的单击事件
        spannableString.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(MainActivity.this,"使用条款",Toast.LENGTH_SHORT).show();
            }
        }, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的前景色
        spannableString.setSpan(new ForegroundColorSpan(Color.RED), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //设置下划线文字
        spannableString.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的单击事件
        spannableString.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(MainActivity.this,"隐私政策",Toast.LENGTH_SHORT).show();
            }
        }, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的前景色
        spannableString.setSpan(new ForegroundColorSpan(Color.RED), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        mTextView.setText(spannableString);
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

1.2.1 测试解决方案一

在这里插入图片描述

1.2.2 测试解决方案二

在这里插入图片描述

1.2.3 测试解决方案三

在这里插入图片描述

1.2.4 测试解决方案四

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客星云

谢谢认可,希望对你的学习有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值