TextView中添加超链接

写在前面的话(特别声明)

本文仅是本人自己学习的总结笔记,参考网上多篇文章,本人仅做了必要的总结和效果展示。

方法一:设置autoLink

autoLink:一共有以下几种值:web,phone,map,email,all,none。
分别是:url连接,电话号码提取拨号,地图地址,电子邮件,全部解释就是能支持的超级连接全部起作用,none就是默认情况,没有超链接。

 <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="15"
        android:autoLink="all"//布局中使用这一句
        String html = "http://www.baidu.com";
        mTextView.setAutoLinkMask(Linkify.ALL);//布局中设置android:autoLink 后这一句就不需要了
        mTextView.setText(html);
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="15"/>
    String html = "有问题:\n";
        html += "<a href='http://www.baidu.com'>百度一下</a>";
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
        mTextView.setText(Html.fromHtml(html));
1、之前方法一布局中的android:autoLink="all" 必须去掉,代码中也不能使用mTextView.setAutoLinkMask(Linkify.ALL),否则识别不出来网址,也就是说两种方法切忌混着用。
2、注意这里必须加上协议号,即http://。否则,系统会以为该链接是activity,而实际这个activity不存在,程序就崩溃。
FATAL EXCEPTION: main
Process: com.bohe.coolweather, PID: 4519
android.content.ActivityNotFoundException: No Activity found to handle Intent
{ act=android.intent.action.VIEW dat=www.baidu.com (has extras) }
mTextView.setMovementMethod(LinkMovementMethod.getInstance());

必须有上面这一句,否则识别不出超链接。
setMovementMethod,此方法在需要响应用户事件时使用,如点击一个电话号码就跳转到拨号页面。如果不执行这个方法是不会响应事件的,即便文本看着已经是下划线字了。

当一段文字部分是超链接或者我们需要点击超链接跳到另一个Activity时,如何处理?答案还是用Spannable。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView mTextView = (TextView) findViewById(R.id.text);
        //将TextView的显示文字设置为SpannableString
        mTextView.setText(getClickableSpan());
        //设置该句使文本的超连接起作用
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
    //设置超链接文字
    private SpannableString getClickableSpan() {
        SpannableString spanStr = new SpannableString("使用该软件,即表示您同意该软件的使用条款和隐私政策");
        //设置下划线文字
        spanStr.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的单击事件
        spanStr.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                startActivity(new Intent(MainActivity.this, TestActivity1.class));
        }, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的前景色
        spanStr.setSpan(new ForegroundColorSpan(Color.RED), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置下划线文字
        spanStr.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的单击事件
        spanStr.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                startActivity(new Intent(MainActivity.this, TestActivity2.class));
        }, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置文字的前景色
        spanStr.setSpan(new ForegroundColorSpan(Color.BLUE), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        return spanStr;
    public void updateDrawState(TextPaint ds) {
        ds.setColor(ds.linkColor);
        ds.setUnderlineText(true);

2、设置下划线文字——此操作就是仅仅给文字加下划线。
3、设置文字的前景色——此操作就是改变文字的前景色。但是该操作和设置文字的单击事件,两者中,后执行的会覆盖先执行的相同字段的颜色,for example,先设置[16,30)文字颜色是RED,后给[20,24)文字设点击事件,那么[20,24)的文字颜色会被默认颜色覆盖,同样反之亦然。
4、涉及到的常量解释

        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;//前后都不包括()
        Spanned.SPAN_EXCLUSIVE_INCLUSIVE;//前不包含后包含(]
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE;//前包含后不包含[)
        Spanned.SPAN_INCLUSIVE_INCLUSIVE;//前后都包含[]

参考链接###

textView 添加超链接(两种实现方式)
android:TextView中的文本链接之--链接的几种方式

延伸链接###

Android TextView使用HTML处理字体样式、显示图片

值得学习###

Android实战技巧之一:文本与布局
Android textView 添加超链接(三种实现方式)
百度知道关于SpannableString用法介绍比较详细的