TextView中添加超链接

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

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


方法一:设置autoLink

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

  • 布局
 
  • 代码
        String html = "http://www.baidu.com";
        mTextView.setAutoLinkMask(Linkify.ALL);//布局中设置android:autoLink 后这一句就不需要了
        mTextView.setText(html);
  • 演示效果
TextView中添加超链接_第1张图片
设置autoLink.gif
  • Tips
    上述代码中的网址,可以不加http://,也能被系统识别出来

方法二:通过HTML格式化网址

  • 布局
 
  • 代码
    String html = "有问题:\n";
        html += "百度一下";
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
        mTextView.setText(Html.fromHtml(html));
  • 演示效果
TextView中添加超链接_第2张图片
HTML格式化网址.gif
  • Tips
    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) }

3、

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;
    }
  • 演示效果
TextView中添加超链接_第3张图片
超链接跳到另一个Activity.gif
  • Tips
    1、设置文字的单击事件——此操作会默认给有单击效果的文字加上下划线和默认颜色(具体颜色因主题不同而不同); 当然,之所以会有默认的颜色和下划线,是因为ClickableSpan类中的updateDrawState(TextPaint ds)这个方法,如果你想去掉下划线或者改变默认颜色,可重写该方法或者使用2、3中的操作

   /**
     * Makes the text underlined and in the link color.
     */
    @Override
    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用法介绍比较详细的

TextView中添加超链接_第4张图片
MovementMethod子类关系.png

Google出来的第一篇博客,垃圾百度居然第一页都没有这篇文章

你可能感兴趣的:(TextView中添加超链接)