Android-выделить слово в TextView?
у меня есть database search query
который ищет в базе данных слово, введенное пользователем, и возвращает Cursor
.
в своем ListActivity
, у меня есть ListView
который будет содержать элементы (элементы Курсора). The ListView
расположение элементов в основном TextView
. Я имею в виду ListView
будет список TextView
s.
Я хочу, чтобы выделить 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 индексами и "частичным цветным текстом" на строку заголовка.
Я этого не делал, но это выглядит многообещающе:
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>