Ao preencher um ListView, eu esperava destacar algumas palavras-chave nas entradas correspondentes TextView. Eu tinha uma classe para meus dados e um ArrayAdapter personalizado para dar corpo a eles, mas isso pode ser facilmente modificado para funcionar em uma entrada.
private Spannable highlightSearchKey(String title) {
Spannable highlight;
Pattern pattern;
Matcher matcher;
int word_index;
String title_str;
word_index = words.length;
title_str = Html.fromHtml(title).toString();
highlight = (Spannable) Html.fromHtml(title);
for (int index = 0; index < word_index; index++) {
pattern = Pattern.compile("(?i)" + words[index]);
matcher = pattern.matcher(title_str);
while (matcher.find()) {
highlight.setSpan(
new BackgroundColorSpan(0x44444444),
matcher.start(),
matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return highlight;
}
O loop FOR itera sobre cada palavra em uma frase de palavra-chave, cria um padrão de expressão regular (que não faz distinção entre maiúsculas e minúsculas) e um matcher correspondente para pegar cada correspondência na string principal (‘título’). O loop WHILE usa a função setSpan para criar uma caixa de fundo em cada índice de ‘início’ e ‘fim’ de uma palavra-chave. Depois de concluído, o Spannable retornado pode ser usado por um TextView diretamente.