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);
  • 演示效果
设置autoLink.gif
  • Tips
    上述代码中的网址,可以不加http://,也能被系统识别出来

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

  • 布局
 <TextView
        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));
  • 演示效果
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;
    }
  • 演示效果
超链接跳到另一个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用法介绍比较详细的

MovementMethod子类关系.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容