4

I have three regular expression:

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

I have a string :

This is a #sample #twitter text of @tom_cruise with a link http://tom_cruise.me

I need to match this text with the above three regular expression and color the matched text with Blue and set the final text in a TextView. How can I achieve that?

It is to be mentioned that I don't need to Linkify the text, only coloring. And I am not using Twitter4j Library.

2 Answers 2

7

I replaced http://tom_cruise.me with http://www.google.com. Try the following:

String a = "This is a #sample #twitter text of @tom_cruise with a link http://www.google.com";

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

StringBuffer sb = new StringBuffer(a.length());
Matcher o = hashtagPattern.matcher(a);

while (o.find()) {
    o.appendReplacement(sb, "<font color=\"#437C17\">" + o.group(1) + "</font>");
}
o.appendTail(sb);

Matcher n = mentionPattern.matcher(sb.toString());
sb = new StringBuffer(sb.length());

while (n.find()) {
    n.appendReplacement(sb, "<font color=\"#657383\">" + n.group(1) + "</font>");
}
n.appendTail(sb);

Matcher m = urlPattern.matcher(sb.toString());
sb = new StringBuffer(sb.length());

while (m.find()) {
    m.appendReplacement(sb, "<font color=\"#EDDA74\">" + m.group(1) + "</font>");
}
m.appendTail(sb);

textView.setText(Html.fromHtml(sb.toString()));
Sign up to request clarification or add additional context in comments.

9 Comments

Thanks for answer :) Everything seems okay except two things. How can I put color code instead of blue? I tried it but not working. And the '@' and '#' are not showing in the final text
@typedef The required portions of the text aren't blue? Or are you saying that you are not able to use a different color code.
I need a different color code close to blue like #6ccff6 but after applying <font color=\"#6ccff6\"> The color isn't change. Instead it is showing the markup in textview
@typedef I have edited my answer above after solving the color code problem in a hackish way. What we are doing here is passing the StringBuffer from one Matcher to the next. So, the Matcher with (#[A-Za-z0-9_-]+) is messing up with color codes. In my edited code above, I am passing the original string to Pattern hashtagPattern first. And then, whatever comes out is passed to the other matchers. This solves your color code problem. And, thanks for the accept!
Great code, also check this for making clickable with SpannableString stackoverflow.com/a/7837610/3736955
|
0

Take a look at SpannableString and SpannableStringBuilder. An example of using the SpannableStringBuilder is available at https://stackoverflow.com/a/16061128/1321873

You could write a method that accepts the non-styled String and returns a CharSequence like so:

private CharSequence getStyledTweet(String tweet){
    SpannableStringBuilder stringBuilder = new SpannableStringBuilder(tweet);
    //Find the indices of the hashtag pattern, mention pattern and url patterns 
    //and set the spans accordingly
    //...
    return stringBuilder;
}

and then use the return value from the above to set the text of the TextView

TextView tView = (TextView)findViewById(R.id.myText);
tView.setText(getStyledTweet(tweet));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.