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.

24
demandé sur iTurki 2011-07-27 15:32:35

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));
37
répondu Shailendra Singh Rajawat 2014-06-05 15:58:27
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/2160827

18
répondu finstas 2017-05-23 10:31:35

je 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

2
répondu Tim 2011-07-27 11:45:01

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));
2
répondu Sumit 2017-11-06 17:41:06

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);
1
répondu xeoh 2017-08-25 07:27:50

- 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>
0
répondu Isaac Sekamatte 2018-07-23 13:30:32