Android-выделить слово в TextView?

у меня есть database search query который ищет в базе данных слово, введенное пользователем, и возвращает Cursor.

в своем ListActivity, у меня есть ListView который будет содержать элементы (элементы Курсора). The ListView расположение элементов в основном TextView. Я имею в виду ListView будет список TextViews.

Я хочу, чтобы выделить search term везде, где он появляется в TextView. Я имею в виду, выделяя: другой цвет или другой цвет фона или что-нибудь еще это отличается от остальной части текста.

это возможно? и как?

обновление:

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

Для @Shailendra:search() метод вернет некоторые названия. Я хочу выделить слова в тех заголовках, которые соответствуют term слово. Надеюсь, теперь все ясно.

6 ответов


вставьте HTML-код для цвета, затем установите его в свой текст .

как

origString = origString.replaceAll(textToHighlight,"<font color='red'>"+textToHighlight+"</font>");

Textview.setText(Html.fromHtml(origString));

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

числа 2 и 4 являются индексами запуска/остановки для раскраски текста, в этом примере "rti" будет окрашен.

таким образом, вы в основном просто найдете начальный индекс вашего поискового слова в названии:

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

а затем замените числа 2 и 4 индексами и "частичным цветным текстом" на строку заголовка.

источник:https://stackoverflow.com/a/10279703/2160827


Я этого не делал, но это выглядит многообещающе:

http://developer.android.com/reference/android/text/SpannableString.html
http://developer.android.com/guide/topics/resources/string-resource.html

общественные окончательной недействительными помощью setText (CharSequence оцените текст)

Since: API Level 1 устанавливает строковое значение TextView. Поле TextView не принимает HTML-форматирование, которое можно выполнять с текстом строки в XML-файлах ресурсов. Чтобы стиль ваших строк, прикрепите андроид.текст.стиль.* объекты SpannableString или см. Документация по доступным типам ресурсов для примера настройки форматированный текст в файле ресурсов XML.

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


Я знаю, что это старый вопрос, но я создал метод для выделения повторяющегося слова в строке\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;
    }
}

использование:

textView.setText(highlight(primaryColor, textAll, wordToHighlight));

попробуйте эту библиотеку Android TextHighlighter.

реализации

TextView.setText() получает параметр как Spannable не только CharacterSequence. SpannableString имеет метод setSpan() что позволяет применять стили.

см. список символов формы прямого подклассаhttps://developer.android.com/reference/android/text/style/CharacterStyle.html

  • пример предоставления цвета фона и цвета переднего плана для word "Привет" В "Привет, Мир"
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);

вами xml strings Если ваши строки статичны

<string name="my_text">This text is <font color='red'>red here</font></string>