web-dev-qa-db-fra.com

Android - Surligner un mot dans un TextView?

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.

26
iTurki

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));
38
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.

source: https://stackoverflow.com/a/10279703/2160827

19
finstas

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));
2
Sumit

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

2
Tim

Essayez cette bibliothèque Android TextHighlighter

Implémentations

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

  • exemple de définition de la couleur d'arrière-plan et de la couleur de premier plan pour Word "Hello" dans "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
xeoh

Plus facile

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

 Output

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.

0
Khemraj

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>
0
Isaac Sekamatte