Приведенные здесь ответы верны, но не могут быть вызваны в цикле, потому что StyleSpanобъект представляет собой один непрерывный промежуток (не стиль, который можно применить к нескольким промежуткам). Вызов setSpanнескольких раз с одним и тем же полужирным шрифтом StyleSpanсоздаст один полужирный диапазон и просто переместит его в родительский диапазон.
В моем случае (отображение результатов поиска) мне нужно было сделать все экземпляры всех ключевых слов для поиска жирным шрифтом. Вот что я сделал:
private static SpannableStringBuilder emboldenKeywords(final String text,
final String[] searchKeywords) {
final String loweredMasterText = text.toLowerCase(Locale.ENGLISH);
final SpannableStringBuilder span = new SpannableStringBuilder(text);
for (final String keyword : searchKeywords) {
final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH);
int offset = 0;
int start;
final int len = keyword.length();
while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) {
span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE);
offset = start + len;
}
}
return span;
}
Имейте в виду, что приведенный выше код недостаточно умен, чтобы пропустить двойное выделение жирным шрифтом, если одно ключевое слово является подстрокой другого. Например, если вы ищете "Fish fi" внутри «FISH in the Fisty Sea», он выделит жирным один раз слово «рыба», а затем часть «fi» . Хорошо то, что, хотя он неэффективен и немного нежелателен, он не будет иметь визуальных недостатков, поскольку отображаемый результат будет по-прежнему выглядеть как
Рыба в фи StY море