I have a string that has specific words I want to color. Those words are the one's that start with #.
if(title.contains("#")){
SpannableString WordtoSpan = new SpannableString(title);
int idx = title.indexOf("#");
if (idx >= 0) {
Pattern pattern = Pattern.compile("[ ,\\.\\n]");
Matcher matcher = pattern.matcher(title);
int wordEnd = matcher.find(idx)? matcher.start() : -1;
if (wordEnd < 0) {
wordEnd = title.length();
}
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE),
idx,
wordEnd,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
holder.txtTitle.setText(WordtoSpan);
} else {
holder.txtTitle.setText(title);
}
Now lets take for example this string Bold part is for example the colored words.
I love cheese #burgers, and with #ketchup.
^ This is my current thing with my code. What I want is to color every #
word, not just first one.
ex. It'll be like
I love cheese #burgers, and with #ketchup.
I think I need to loop? But couldn't get it clearly and working x.x
Update: Latest try. List becomes blank.
SpannableString WordtoSpan = new SpannableString(title);
int end = 0;
Pattern pattern = Pattern.compile("[ ,\\.\\n]");
Matcher matcher = pattern.matcher(title);
int i = title.indexOf("#");
for (i = 0; i < title.length(); i++) {
if (i >= 0) {
int wordEnd = matcher.find(i)? matcher.start() : -1;
if (wordEnd < 0) {
wordEnd = title.length();
}
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE),
i,
wordEnd,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
i = end;
}
holder.txtTitle.setText(WordtoSpan);
}
I had provided this answer earlier here - https://stackoverflow.com/a/20179879/3025732
String text = "I love chicken #burger , cuz they are #delicious";
//get the text from TextView
Pattern HASHTAG_PATTERN = Pattern.compile("#(\\w+|\\W+)");
Matcher mat = HASHTAG_PATTERN.matcher(text);
while (mat.find()) {
String tag = mat.group(0);
//String tag will contain the hashtag
//do operations with the hashtag (change color)
}
[EDIT]
I've modified the code and done it according to what you need:
SpannableString hashText = new SpannableString(text.getText().toString());
Matcher matcher = Pattern.compile("#([A-Za-z0-9_-]+)").matcher(hashText);
while (matcher.find())
{
hashText.setSpan(new ForegroundColorSpan(Color.BLUE), matcher.start(), matcher.end(), 0);
}
text.setText(hashText);
Here's a screenshot of it:
I'm surprised that no one has mentioned this:
// String you want to perform on
String toChange = "I love cheese #burgers, and with #ketchup.";
// Matches all characters, numbers, underscores and dashes followed by '#'
// Does not match '#' followed by space or any other non word characters
toChange = toChange.replaceAll("(#[A-Za-z0-9_-]+)",
"<font color='#0000ff'>" + "$0" + "</font>");
// Encloses the matched characters with html font tags
// Html#fromHtml(String) returns a Spanned object
holder.txtTitle.setText(Html.fromHtml(toChange));
#0000ff
==>> Color.BLUE
Screenshot:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With