TextView中添加超链接

作者: CalvinNing | 来源:发表于2016-08-12 15:36 被阅读1436次

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

    本文仅是本人自己学习的总结笔记,参考网上多篇文章,本人仅做了必要的总结和效果展示。如果你在找该话题的文章,看这一篇就够了,因为我的排版最漂亮2333


    方法一:设置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出来的第一篇博客,垃圾百度居然第一页都没有这篇文章

    相关文章

      网友评论

      本文标题:TextView中添加超链接

      本文链接:https://www.haomeiwen.com/subject/zpqesttx.html