J'ai un database search query
qui recherche dans la base de données un mot entré par l'utilisateur et renvoie un Cursor
.
Dans ma ListActivity
, j'ai une ListView
qui contiendra les éléments (les éléments de curseur). La disposition des éléments ListView
est fondamentalement une TextView
. Je veux dire, la ListView
sera une liste de TextView
's.
Ce que je veux, c'est mettre en surbrillance le search term
partout où il apparaît dans la TextView
. Je veux dire en soulignant: une couleur différente ou une couleur d’arrière-plan différente ou quoi que ce soit qui le rend différent du reste du texte.
Est-ce possible? et comment?
Mettre à jour:
cursor = myDbHelper.search(term); //term: a Word entered by the user.
cursor.moveToFirst();
String[] columns = {cursor.getColumnName(1)};
int[] columnsLayouts = {R.id.item_title}; //item_title: the TextView holding the one raw
ca = new SimpleCursorAdapter(this.getBaseContext(), R.layout.items_layout, cursor,columns , columnsLayouts);
lv = getListView();
lv.setAdapter(ca);
Pour @Shailendra: La méthode search()
renverra certains titres. Je souhaite mettre en évidence les mots de ces titres qui correspondent au mot term
. J'espère que c'est clair maintenant.
insérez du code HTML pour la couleur autour de Word et définissez-le sur votre textView.
comme
String newString = oldString.replaceAll(textToHighlight, "<font color='red'>"+textToHighlight+"</font>");
textView.setText(Html.fromHtml(newString));
TextView textView = (TextView)findViewById(R.id.mytextview01);
//use a loop to change text color
Spannable WordtoSpan = new SpannableString("partial colored text");
WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(WordtoSpan);
Les chiffres 2 et 4 sont des index de début/fin pour la coloration du texte. Dans cet exemple, "rti" serait coloré.
Vous trouverez donc simplement l'index de départ de votre recherche dans le titre:
int startIndex = titleText.indexOf(term);
int stopIndex = startIndex + term.length();
puis remplacez les chiffres 2 et 4 par les index et le "texte de couleur partiel" par votre chaîne de titre.
Je sais que c'est une vieille question, mais j'ai créé une méthode pour mettre en évidence un mot répété dans string\paragraph.
private Spannable highlight(int color, Spannable original, String Word) {
String normalized = Normalizer.normalize(original, Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
int start = normalized.indexOf(Word);
if (start < 0) {
return original;
} else {
Spannable highlighted = new SpannableString(original);
while (start >= 0) {
int spanStart = Math.min(start, original.length());
int spanEnd = Math.min(start+Word.length(), original.length());
highlighted.setSpan(new ForegroundColorSpan(color), spanStart,
spanEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
start = normalizedText.indexOf(Word, spanEnd);
}
return highlighted;
}
}
usage:
textView.setText(highlight(primaryColor, textAll, wordToHighlight));
Je ne l'ai pas fait mais cela semble prometteur:
http://developer.Android.com/reference/Android/text/SpannableString.html
http://developer.Android.com/guide/topics/resources/string-resource.html
public final voet setText (texte CharSequence)
Depuis: API niveau 1 Définit la valeur de chaîne du TextView. TextView N'accepte pas le formatage de type HTML, ce que vous pouvez faire avec des chaînes de texte Dans des fichiers de ressources XML. Pour attribuer un style à vos chaînes, attachez des objets Android.text.style. * À SpannableString ou consultez la documentation sur Available Resource Types pour obtenir un exemple de définition du texte formaté Dans XML. fichier de ressources.
http://developer.Android.com/reference/Android/widget/TextView.html
Essayez cette bibliothèque Android TextHighlighter .
TextView.setText()
obtient un paramètre sous la forme Spannable
et pas seulement CharacterSequence
. SpannableString a une méthode setSpan()
qui permet d'appliquer des styles.
Voir la liste de la forme directe de sous-classe CharacterStyle https://developer.Android.com/reference/Android/text/style/CharacterStyle.html
Spannable spannable = new SpannableString("Hello, World");
// setting red foreground color
ForegroundSpan fgSpan = new ForegroundColorSpan(Color.red);
// setting blue background color
BackgroundSpan bgSpan = new BackgroundColorSPan(Color.blue);
// setSpan requires start and end index
// in our case, it's 0 and 5
// You can directly set fgSpan or bgSpan, however,
// to reuse defined CharacterStyle, use CharacterStyle.wrap()
spannable.setSpan(CharacterStyle.wrap(fgSpan), 0, 5, 0);
spannable.setSpan(CharacterStyle.wrap(bgSpan), 0, 5, 0);
// apply spannableString on textview
textView.setText(spannable);
Vous pouvez utiliser Spannable class pour surligner/formater une partie du texte.
textView.setText("Hello, I am Awesome, Most Awesome"); // set text first
setHighLightedText(textView, "a"); // highlight all `a` in TextView
Voici la méthode.
/**
* use this method to highlight a text in TextView
*
* @param tv TextView or Edittext or Button (or derived from TextView)
* @param textToHighlight Text to highlight
*/
public void setHighLightedText(TextView tv, String textToHighlight) {
String tvt = tv.getText().toString();
int ofe = tvt.indexOf(textToHighlight, 0);
Spannable wordToSpan = new SpannableString(tv.getText());
for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
ofe = tvt.indexOf(textToHighlight, ofs);
if (ofe == -1)
break;
else {
// set color here
wordToSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + textToHighlight.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
}
}
}
Vous pouvez cochez cette réponse pour le texte surligné en surbrillance.
Vous le faites dans xml strings
si vos chaînes sont statiques
<string name="my_text">This text is <font color='red'>red here</font></string>