Android TextView中实现点击文本超链接(无下划线)的封装类

android中有的时候须要在TextView上设置一些超链接,点击这些超链接时进行一些操作。比如新浪微博上的一些keyword,点击时会跳转到对应的页面。

怎样实现我们就直接看源代码吧。

/**
 *
 *	created by Mr.Simple, Aug 21, 20141:51:40 PM.
 *	Copyright (c) 2014, hehonghui@umeng.com All Rights Reserved.
 *
 *                #####################################################
 *                #                                                   #
 *                #                       _oo0oo_                     #
 *                #                      o8888888o                    #
 *                #                      88" . "88                    #
 *                #                      (| -_- |)                    #
 *                #                      0\  =  /0                    #
 *                #                    ___/`---‘\___                  #
 *                #                  .‘ \\|     |# ‘.                 #
 *                #                 / \\|||  :  |||# \                #
 *                #                / _||||| -:- |||||- \              #
 *                #               |   | \\\  -  #/ |   |              #
 *                #               | \_|  ‘‘\---/‘‘  |_/ |             #
 *                #               \  .-\__  ‘-‘  ___/-. /             #
 *                #             ___‘. .‘  /--.--\  `. .‘___           #
 *                #          ."" ‘<  `.___\_<|>_/___.‘ >‘ "".         #
 *                #         | | :  `- \`.;`\ _ /`;.`/ - ` : | |       #
 *                #         \  \ `_.   \_ __\ /__ _/   .-` /  /       #
 *                #     =====`-.____`.___ \_____/___.-`___.-‘=====    #
 *                #                       `=---=‘                     #
 *                #     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   #
 *                #                                                   #
 *                #               佛祖保佑         永无BUG              #
 *                #                                                   #
 *                #####################################################
 */

package com.umeng.community.utils;

import android.content.Context;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.widget.TextView;

/**
 * @author mrsimple
 */
public abstract class TopicSpanWrapper extends ClickableSpan {
    protected Context mContext;
    protected TextView mTextView;

    /**
     * @param context
     * @param tv
     */
    public TopicSpanWrapper(Context context, TextView tv) {
        mContext = context;
        mTextView = tv;
        updateClickSpan(tv);
    }

    /**
     * 更新Span
     *
     * @param rv
     */
    public void updateClickSpan(TextView tv) {
        // 这里拼接超链接, 我在前后加了一个井号,可自行去除
        String htmlLinkText = "<a href=‘这里能够填写某个url‘>#" + tv.getText().toString() + "#</a>";

        tv.setText(Html.fromHtml(htmlLinkText));
        tv.setMovementMethod(LinkMovementMethod.getInstance());
        CharSequence text = tv.getText();
        if (text instanceof Spannable) {
            int end = text.length();
            Spannable sp = (Spannable) tv.getText();
            URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
            SpannableStringBuilder style = new SpannableStringBuilder(text);
            style.clearSpans(); // should clear old spans
            for (URLSpan url : urls) {
                // 设置Span
                style.setSpan(this, sp.getSpanStart(url), sp.getSpanEnd(url),
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            tv.setText(style);
        }
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        // 去掉超链接的下划线
        ds.setUnderlineText(false);
    }
}

使用演示样例 :

public class UserInfoActivity extends FragmentActivity implements OnClickListener {

    FragmentManager mFragmentMan;

    private TextView mUserNameTv;

    /*
     * (non-Javadoc)
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.umeng_comm_user_info);

        initUIComponents();
    }

    /**
     *
     */
    private void initUIComponents() {
        mFragmentMan = getSupportFragmentManager();
        mPostedFragment = new PostedFragment();
        mFragmentMan
                .beginTransaction()
                .add(R.id.user_info_fragment_container, mPostedFragment,
                        PostedFragment.class.getSimpleName()).commit();

        // 布局就不给出了,总之user_name_tv是一个TextView
        mUserNameTv = (TextView) findViewById(R.id.user_name_tv);

        /**
         * 将TextView中的文本包装成可点击的超链接
         */
        new TopicSpanWrapper(this, mUserNameTv) {

            @Override
            public void onClick(View widget) {
                Toast.makeText(mContext, "点击了超链接文本", Toast.LENGTH_SHORT).show();
            }
        };

    }

}

效果如图 :

点击以后

图片中Toast的文字和代码的不一致,是由于文中写的与我demo中的文字不一样,直接忽略这个问题就可以。

时间: 2024-10-08 15:16:29

Android TextView中实现点击文本超链接(无下划线)的封装类的相关文章

Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属

在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下. res-layout-main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

(转)Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性以及自定义链接到下一个Activity

在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下. res-layout-main.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns

TextView 设置无下划线超链接

// 设置无下划线超链接 start String textStr = "13771839951;021-12345678"; text.setAutoLinkMask(Linkify.PHONE_NUMBERS); text.setText(textStr); Spannable s = (Spannable) text.getText(); s.setSpan(new UnderlineSpan() { @Override public void updateDrawState(T

使用CSS去除 去掉超链接的下划线方法

我们可以用CSS语法来控制超链接的形式.颜色变化,为什么链接一定要使用下划线和颜色区分呢? 其主要原因主要是考虑到   1.视力差的人 2.色盲的人 ... 下面我们做一个这样的链接:未被点击时超链接文字无下划线,显示为蓝色:当鼠标在链接上时有下划线,链接文字显示为红色:当点击链接后,链接无下划线,显示为绿色. 实现方法很简单,在源代码的<head>和<head>之间加上如下的CSS语法控制: <style type="text/css"> <

html超链接添加下划线

在需要的连接添加行内样式: <a href="ddrb/090630.asp" target="_blank" style="text-decoration:underline;">30</a> CSS text-decoration 属性 可能的值 值 描述 none 默认.定义标准的文本. underline 定义文本下的一条线. overline 定义文本上的一条线. line-through 定义穿过文本下的一条线

如何去掉超链接的下划线

如何去掉超链接的下划线:建议:尽可能的手写代码,可以有效的提高学习效率和深度.每个人的欣赏事物的角度不一样,有些人喜欢链接带有下划线,有的人不喜欢,下面介绍一下如何去掉超链接的下划线.在默认状态下,链接一般是带有下划线的,那么我们可以使用text-decoration属性来设置链接是否具有下划线.实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta nam

Android TextView中文字设置超链接、颜色、字体

TextView是用来显示文本的,有时需要给TextView中的个别字设置为超链接,或者设置个别字的颜色.字体等,那就需要用到Spannable对象,可以借助Spannable对象实现以上设置. 效果图: Activity代码: import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.text.Spannable; import android.tex

android textview 中部分内容 颜色 样式 点击事件的设置

// 文本内容 SpannableString ss = new SpannableString(remindtitle); int stringlength = ss.length(); // 设置0-2的字符颜色 ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置2-5的字符链接到电话簿,点击时触发拨号 ss.setSpan(new URLSpan("tel

android TextView中识别多个url并分别点击跳转

实现方案:private String pattern = "((http|ftp|https)://)(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?|(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\