Android-mettre en évidence un mot dans un TextView?
j'ai un database search query
recherche dans la base de données pour un mot entré par l'utilisateur et retourner un Cursor
.
Dans mon ListActivity
, j'ai ListView
qui conservera les éléments (les éléments du curseur). ListView
la mise en page des éléments est essentiellement un TextView
. Je veux dire, la ListView
sera une liste de TextView
.
ce que je veux c'est mettre en évidence le search term
partout où il apparaît dans le TextView
. Je veux dire en mettant en évidence: une couleur différente ou une couleur de fond différente ou n'importe quoi fait il de différent que le reste du texte.
Est-ce possible? et comment?
mise à 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: Le search()
la méthode retournera certains titres. Je veux mettre en évidence les mots dans ces titres qui correspondent au term
mot. J'espère que c'est clair maintenant.
6 réponses
insérez le code HTML pour la couleur, puis réglez cela sur votre texte .
origString = origString.replaceAll(textToHighlight,"<font color='red'>"+textToHighlight+"</font>");
Textview.setText(Html.fromHtml(origString));
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 numéros 2 et 4 sont des index start/stop pour la coloration du texte, dans cet exemple "rti" serait coloré.
alors vous trouverez simplement l'index de départ de votre mot de recherche dans le titre:
int startIndex = titleText.indexOf(term);
int stopIndex = startIndex + term.length();
et ensuite remplacer les numéros 2 et 4 par les index et "texte partiellement coloré" par votre chaîne de titres.
https://stackoverflow.com/a/10279703/2160827je ne l'ai pas fait mais ça a l'air prometteur:
http://developer.android.com/reference/android/text/SpannableString.html
http://developer.android.com/guide/topics/resources/string-resource.html
public final void setText (CharSequence text)
Since: API Level 1 définit la valeur de la chaîne de caractères de TextView. TextView n'accepte pas le formatage HTML, ce que vous pouvez faire avec du texte les chaînes de caractères dans les fichiers de ressources XML. Pour coiffer vos cordes, attachez Android.texte.style.* s'oppose à un SpannableString, ou voir le Types de ressources disponibles documentation pour un exemple de contexte formater texte dans le fichier de ressources XML.
http://developer.android.com/reference/android/widget/TextView.html
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;
}
}
utilisation:
textView.setText(highlight(primaryColor, textAll, wordToHighlight));
Essayez cette bibliothèque Android TextHighlighter.
Implémentations
TextView.setText()
devient un paramètre Spannable
non seulement CharacterSequence
. SpannableString a une méthode setSpan()
qui permet d'appliquer des styles.
voir la liste des formes directes de la sous-classe Caracterstyle https://developer.android.com/reference/android/text/style/CharacterStyle.html
- exemple de couleur d'arrière-plan et de couleur d'avant-plan pour mot "Bonjour", "Hello, World!"
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 le faire dans xml strings
si vos cordes sont statiques
<string name="my_text">This text is <font color='red'>red here</font></string>