在案例不敏感的文本视图中突出显示某些文本背景

时间:2017-10-10 10:26:11

标签: android normalization spannable

我想用一些不区分大小写的颜色突出显示某些文本背景。我尝试了下面的代码,但它没有用。它仅在关键字为小写时突出显示。

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

例如我有一个原始文本=&#34;我喜欢Stackoverflow&#34;关键字是&#34;我爱&#34;。如何突出&#34;我爱&#34;的文字背景?没有改成小写并保持案例。

enter image description here

谢谢。

3 个答案:

答案 0 :(得分:1)

我从这里得到了答案: 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);

答案 1 :(得分:0)

作为更新Mei Yi's answer

如果在TextView上设置布局属性,例如android:textAllCaps="true",则可能会覆盖用于设置突出显示的Spannable字符串,看起来它不起作用。这很容易解决;只需以编程方式设置布局属性。

实施例。 textView.setText(text.toUpperCase())代替android:textAllCaps="true"

答案 2 :(得分:0)

这将解决您的问题

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

秘密在于将两个字符串的所有大小写都更改为小写,同时尝试突出显示文本的位置。 我希望它能对某人有所帮助。