代码之家  ›  专栏  ›  技术社区  ›  Mei Yi

在文本视图中突出显示某些文本背景,不区分大小写

  •  0
  • Mei Yi  · 技术社区  · 7 年前

     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;
    }
    

    例如,我有一个原始文本=“I Love Stackoverflow”,关键字是“I Love”。如何突出显示“I love”的文本背景,而不将其改为小写,并保持大小写不变。

    enter image description here

    非常感谢。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Raghav Satyadev    5 年前

    我从这里得到了答案: 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);
    
        2
  •  0
  •   Stephen Rauch Eugen    6 年前

    Mei Yi's answer :

    如果在上设置布局属性 TextView android:textAllCaps="true"

    前任。 textView.setText(text.toUpperCase()) 而不是

        3
  •  0
  •   Ray    4 年前

    这会解决你的问题

    String text = "I Love StackOverflow";
    String hilyt = "i love";
    
     //to avoid issues ahead make sure your
    // to be highlighted exists in de text
    if( !(text.toLowerCase().contains(hilyt.toLowerCase())) )
    return;
    
    int x = text.toLowerCase().indexOf(hilyt.toLowerCase());
    int y = x + hilyt.length();
    
    Spannable span = new SpannableString(text);        
    span.setSpan(new BackgroundColorSpan(Color.YELLOW), x, y, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
    yourTextView.setText(span);
    

    秘诀是将两个字符串的所有大小写都改为小写,同时尝试突出显示文本的位置。