Android - Highlight a Word In a TextView?

后端 未结 9 1759
予麋鹿
予麋鹿 2020-12-07 15:57

I have a database search query which search in the database for a word entered by the user and return a Cursor.

In my ListActivity

相关标签:
9条回答
  • 2020-12-07 16:21

    You do so in xml strings if your strings are static

    <string name="my_text">This text is <font color='red'>red here</font></string>
    
    0 讨论(0)
  • 2020-12-07 16:25

    I haven't done it but this looks promising:

    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 Sets the string value of the TextView. TextView does not accept HTML-like formatting, which you can do with text strings in XML resource files. To style your strings, attach android.text.style.* objects to a SpannableString, or see the Available Resource Types documentation for an example of setting formatted text in the XML resource file.

    http://developer.android.com/reference/android/widget/TextView.html

    0 讨论(0)
  • 2020-12-07 16:26

    insert HTML code for color around word and set it to your textView .

    like

    String newString = oldString.replaceAll(textToHighlight, "<font color='red'>"+textToHighlight+"</font>");
    textView.setText(Html.fromHtml(newString));
    
    0 讨论(0)
  • 2020-12-07 16:26

    Based on the previous answers I developed the following function, you can copy/paste it

     private void highlightMask(TextView textView, String text, String mask) {
                boolean highlightenabled = true;
                boolean isHighlighted = false;
    
                if (highlightenabled) {
                    if (!TextUtils.isEmpty(text) && !TextUtils.isEmpty(mask)) {
                        String textLC = text.toLowerCase();
                        mask = mask.toLowerCase();
    
                        if (textLC.contains(mask)) {
                            int ofe = textLC.indexOf(mask, 0);
                            Spannable wordToSpan = new SpannableString(text);
                            for (int ofs = 0; ofs < textLC.length() && ofe != -1; ofs = ofe + 1) {
                                ofe = textLC.indexOf(mask, ofs);
                                if (ofe == -1) {
                                    break;
                                } else {
                                    // set color here
                                    wordToSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + mask.length(),
                                                       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                                    textView.setText(wordToSpan, TextView.BufferType.SPANNABLE);
                                    isHighlighted = true;
                                }
                            }
    
                        }
                    }
                }
    
                if (!isHighlighted) {
                    textView.setText(text);
                }
            }
    
    0 讨论(0)
  • 2020-12-07 16:29

    I know it's old question but i have created a method to highlight a repeated-word in 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));
    
    0 讨论(0)
  • 2020-12-07 16:33
    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);
    

    The numbers 2 and 4 are start/stop indexes for the coloring of the text, in this example "rti" would be colored.

    So you would basically just find the starting index of your searching word in the title:

    int startIndex = titleText.indexOf(term);
    int stopIndex = startIndex + term.length();
    

    and then replace the numbers 2 and 4 with the indexes and "partial colored text" with your title string.

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

    0 讨论(0)
提交回复
热议问题