As respostas fornecidas aqui estão corretas, mas não podem ser chamadas em um loop porque o StyleSpan
objeto é uma única extensão contígua (não um estilo que pode ser aplicado a várias extensões). Chamar setSpan
várias vezes com o mesmo negrito StyleSpan
criaria um intervalo em negrito e apenas o moveria no intervalo pai.
No meu caso (exibindo os resultados da pesquisa), eu precisava fazer todas as instâncias de todas as palavras-chave da pesquisa aparecerem em negrito. Isso é o que eu fiz:
private static SpannableStringBuilder emboldenKeywords(final String text,
final String[] searchKeywords) {
// searching in the lower case text to make sure we catch all cases
final String loweredMasterText = text.toLowerCase(Locale.ENGLISH);
final SpannableStringBuilder span = new SpannableStringBuilder(text);
// for each keyword
for (final String keyword : searchKeywords) {
// lower the keyword to catch both lower and upper case chars
final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH);
// start at the beginning of the master text
int offset = 0;
int start;
final int len = keyword.length(); // let's calculate this outside the 'while'
while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) {
// make it bold
span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE);
// move your offset pointer
offset = start + len;
}
}
// put it in your TextView and smoke it!
return span;
}
Lembre-se de que o código acima não é inteligente o suficiente para ignorar o negrito duplo se uma palavra-chave for uma substring da outra. Por exemplo, se você pesquisar por "Peixe fi" dentro de "Peixes no mar fisty" , o "peixe" ficará em negrito uma vez e depois a parte "fi" . O bom é que, embora ineficiente e um pouco indesejável, não terá uma desvantagem visual, pois o resultado exibido ainda será
Peixes es na fi Mar sty