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());
}
}