一个TextView的文本颜色,使用两个Linkify和可点击的网络链接

时间:2014-11-26 09:54:35

标签: android twitter linkify

我希望Twitter提及红色和主题标签是另一种颜色,如果任何推文包含任何网页链接..链接应该是可点击的并通过意图传递给另一个活动(WebView)。

我怎样才能实现这个目标?

   TransformFilter filter = new TransformFilter() {
                public final String transformUrl(final Matcher match, String url) {
                    return match.group();
                }
            };

            Pattern mentionPattern = Pattern.compile("@([A-Za-z0-9_-]+)");
            String mentionScheme = "http://www.twitter.com/";
            Linkify.addLinks(tvMessage, mentionPattern, mentionScheme, null, filter);


            Pattern hashtagPattern = Pattern.compile("#([A-Za-z0-9_-]+)");
            String hashtagScheme = "http://www.twitter.com/search/";
            Linkify.addLinks(tvMessage, hashtagPattern, hashtagScheme, null, filter);

            Pattern urlPattern = Patterns.WEB_URL;
            Linkify.addLinks(tvMessage, urlPattern, null, null, filter);

 // tvMessage.setLinkTextColor(Color.parseColor("#3467BB"));

enter image description here

1 个答案:

答案 0 :(得分:6)

Finally i have achieved hashtags weblinks clickable and made them very attractive by keeping different colors使用android sdk SpannableString及它的ClickableSpan。

private void Linkfiy(String a, TextView textView) {

        Pattern urlPattern = Patterns.WEB_URL;
        Pattern mentionPattern = Pattern.compile("(@[A-Za-z0-9_-]+)");
        Pattern hashtagPattern = Pattern.compile("#(\\w+|\\W+)");

        Matcher o = hashtagPattern.matcher(a);
        Matcher mention = mentionPattern.matcher(a);
        Matcher weblink = urlPattern.matcher(a);


        SpannableString spannableString = new SpannableString(a);
        //#hashtags

        while (o.find()) {

            spannableString.setSpan(new NonUnderlinedClickableSpan(o.group(),
                    0), o.start(), o.end(),
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        }

        // --- @mention
        while (mention.find()) {
            spannableString.setSpan(
                    new NonUnderlinedClickableSpan(mention.group(), 1), mention.start(), mention.end(),
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        }
        //@weblink
        while (weblink.find()) {
            spannableString.setSpan(
                    new NonUnderlinedClickableSpan(weblink.group(), 2), weblink.start(), weblink.end(),
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        }

        textView.setText(spannableString);
        textView.setMovementMethod(LinkMovementMethod.getInstance());


    }

NonUnderlinedClickableSpan

 public class NonUnderlinedClickableSpan extends ClickableSpan {

            int type;// 0-hashtag , 1- mention, 2- url link
            String text;// Keyword or url
            String time;

            public NonUnderlinedClickableSpan(String text, int type) {
                this.text = text;
                this.type = type;
                this.time = time;
            }

            @Override
            public void updateDrawState(TextPaint ds) {
        //adding colors 
                if (type == 1)
                    ds.setColor(InstagramIndetail.this.getResources().getColor(
                            R.color.link_color_mention));
                else if (type == 2)
                    ds.setColor(InstagramIndetail.this.getResources().getColor(
                            R.color.link_color_url));
                else
                    ds.setColor(InstagramIndetail.this.getResources().getColor(
                            R.color.link_color_hashtag));
                ds.setUnderlineText(false);
                // ds.setTypeface(Typeface.DEFAULT_BOLD);
            }

            @Override
            public void onClick(View v) {

                Debug.e("click done", "ok " + text);
                if (type == 0) {
                    //pass hashtags to activity using intents 
                } else if (type == 1) {
                     //do for mentions 
                } else {
 // passing weblinks urls to webview activity
                    startWebViewActivity(text);
                }
            }
        }