Android цикл через строку для цветных слов

У меня есть строка, которая имеет конкретные слова, которые я хочу покрасить. Эти слова начинаются с #.

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); } 

Теперь возьмем, например, эту строку. Жирная часть – это, например, цветные слова.

Я люблю сыр #burgers , и с #ketchup.

^ Это моя текущая вещь с моим кодом. Я хочу покрасить каждое # слово, а не только первое.

ех. Это будет похоже на

Я люблю сыр #burgers , и с #ketchup .

Кажется, мне нужно петлю? Но я не мог понять это и работать xx


Обновление: последняя попытка. Список становится пустым.

  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); } 

Я удивлен, что никто не упомянул об этом:

 // 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

Скриншот:

Введите описание изображения здесь

Я ранее предлагал этот ответ – 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) } 

[РЕДАКТИРОВАТЬ]

Я изменил код и выполнил его в соответствии с тем, что вам нужно:

 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); 

Вот скриншот:

Введите описание изображения здесь

Вам нужно пройти через ваши матчи. Есть предыдущий пост, который вы можете посмотреть здесь:

Поиск нескольких целых чисел внутри строки с использованием Regex

Проверьте следующий пример:

 String title = "Your #complete sentence #testing #test."; printUsingNormal(title); printUsingRegex(title); private static void printUsingRegex(String title) { Pattern pattern = Pattern.compile("[ ,\\.\\n]"); int start = 0; int end = 0; Matcher matcher = pattern.matcher(title); while (end >= 0 && end < title.length()) { start = title.indexOf('#', start); if (start > 0) { end = matcher.find(start) ? matcher.start() : -1; if (end > 0) { System.out.println("Word : " + title.substring(start, end) + " Start : " + start + " End : " + end); start = end; } } else { break; } } } private static void printUsingNormal(String title) { int start = 0; for (int i = 0; i < title.length(); i++) { char c = title.charAt(i); if (c == '#') { start = i; // Got the starting hash int end = title.indexOf(' ', i + 1); // Finding the next space. if (end > 0) { System.out.println("Word : " + title.substring(start, end) + " Start : " + start + " End : " + end); i = end; } else { end=title.length()-1; System.out.println("Word : " + title.substring(start, end) + " Start : " + start + " End : " + end); i = end; } } } } 

Используйте while() , это фрагмент для установки цвета фона текста, который вы искали в встроенном мессенджере Android, вы можете попробовать то же самое в своем коде.

Intereting Posts
Как проверить, зарегистрирован ли пользователь в Google+? Android WebView не обновляется после того, как содержимое веб-сайта было изменено с помощью JavaScript Android Как получить установленные локали системы Получение 0.0 для широты и долготы при отображении текущего местоположения на карте Показать в textview html со встроенными стилями Деятельность Monkeyrunner Событие завершения прокрутки Viewpager Как правильно разместить EditText и ImageButton на Android Пример использования Android в RtpStream Использование акселерометра, гироскопа и компаса для расчета движения устройства в 3D-мире Как просмотреть личность человека, подписавшего apk на устройстве Android? В чем разница между масштабированием и плавным увеличением в андроидной камере? Цикл ViewPager с менее чем 4 видами Защита конечных точек API для API приложений Google Показать буферизацию MediaPlayer в строке поиска в качестве вторичного прогресса