Die hier angegebenen Antworten sind korrekt, können jedoch nicht in einer Schleife aufgerufen werden, da das StyleSpan
Objekt ein einzelner zusammenhängender Bereich ist (kein Stil, der auf mehrere Bereiche angewendet werden kann). Wenn Sie setSpan
mehrmals mit demselben Fettdruck StyleSpan
aufrufen, wird ein Fettdruckbereich erstellt und nur im übergeordneten Bereich verschoben.
In meinem Fall (Anzeigen von Suchergebnissen) musste ich dafür sorgen, dass alle Instanzen aller Suchschlüsselwörter fett angezeigt werden. Das habe ich getan:
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;
}
Beachten Sie, dass der obige Code nicht intelligent genug ist, um doppelte Fettdrucke zu überspringen, wenn ein Schlüsselwort eine Teilzeichenfolge des anderen ist. Zum Beispiel, wenn Sie nach "Fish fi" suchen in "Fische im fistigen Meer" suchen , wird der "Fisch" einmal fett und dann der Teil "fi" fett gedruckt . Das Gute ist, dass es zwar ineffizient und etwas unerwünscht ist, aber keinen visuellen Nachteil hat, da Ihr angezeigtes Ergebnis immer noch so aussieht
Fische es in der fi sty Sea