androidnormalizationspannable

Highlight Certain Text Background In Text View With Case Insensitive


I want to highlight certain text background with some color with case insensitive. I tried the code below but it's not working. It only highlights when the keyword is in lowercase.

 private static CharSequence highlightText(String search, String originalText) {
    if (search != null && !search.equalsIgnoreCase("")) {
        String normalizedText = Normalizer.normalize(originalText, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "").toLowerCase().;
        int start = normalizedText.indexOf(search);
        if (start < 0) {
            return originalText;
        } else {
            Spannable highlighted = new SpannableString(originalText);
            while (start >= 0) {
                int spanStart = Math.min(start, originalText.length());
                int spanEnd = Math.min(start + search.length(), originalText.length());
                highlighted.setSpan(new BackgroundColorSpan(Color.YELLOW), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                start = normalizedText.indexOf(search, spanEnd);
            }
            return highlighted;
        }
    }
    return originalText;
}

For example I have a original text = "I Love Stackoverflow" and the keyword is "i love". How can I highlight the text background of "i love" without changing it to lower case and maintain the case.

enter image description here

Thank you.


Solution

  • I got the answer from here: Android: Coloring part of a string using TextView.setText()?

    String notes = "aaa AAA xAaax abc aaA xxx";
    SpannableStringBuilder sb = new SpannableStringBuilder(notes);
    Pattern p = Pattern.compile("aaa", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(notes);
    while (m.find()){
    //String word = m.group();
    //String word1 = notes.substring(m.start(), m.end());
    
    sb.setSpan(new BackgroundColorSpan(Color.YELLOW), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
    editText.setText(sb);