Android - 突出显示TextView中的单词()

幼敏悟过人,读书辄成诵。这篇文章主要讲述Android - 突出显示TextView中的单词?相关的知识,希望能为你提供帮助。
我有一个database search query,它在数据库中搜索用户输入的单词并返回Cursor
在我的ListActivity中,我有一个ListView,它将保存项目(光标项目)。 ListView项目布局基本上是TextView。我的意思是,ListView将是TextView的列表。
我想要的是突出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词匹配的标题中的单词。我希望现在很清楚。
答案在word周围插入颜色的html代码并将其设置为textView。
喜欢
String newString = oldString.replaceAll(textToHighlight, "< font color='red'> "+textToHighlight+"< /font> "); textView.setText(Html.fromHtml(newString));

另一答案
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”将被着色。
【Android - 突出显示TextView中的单词()】所以你基本上只需在标题中找到搜索词的起始索引:
int startIndex = titleText.indexOf(term); int stopIndex = startIndex + term.length();

然后用索引替换数字2和4,用标题字符串替换“部分彩色文本”。
来源:https://stackoverflow.com/a/10279703/2160827
另一答案我知道这是一个古老的问题,但我已经创建了一种方法来突出显示stringparagraph中的重复单词。
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));

另一答案我还没有这样做,但看起来很有希望:
http://developer.android.com/reference/android/text/SpannableString.html http://developer.android.com/guide/topics/resources/string-resource.html

public final void setText(CharSequence text)
从以下版本开始:API Level 1设置TextView的字符串值。 TextView不接受类似HTML的格式,您可以使用XML资源文件中的文本字符串。要设置字符串样式,请将android.text.style。*对象附加到SpannableString,或者参阅可用资源类型文档以获取在XML资源文件中设置格式化文本的示例。
http://developer.android.com/reference/android/widget/TextView.html
另一答案试试这个库Android TextHighlighter。
Implementations
TextView.setText()得到一个参数Spannable不仅CharacterSequence。 SpannableString有一个方法setSpan(),允许应用样式。
请参阅CharacterStyle https://developer.android.com/reference/android/text/style/CharacterStyle.html的直接子类列表
  • 在“Hello,World”中为单词“Hello”提供背景颜色和前景色的示例
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>

另一答案 More Easy Way您可以使用Spannable类突出显示/格式化文本的一部分。
textView.setText("Hello, I am Awesome, Most Awesome"); // set text first setHighLightedText(textView, "a"); // highlight all `a` in TextView

Android - 突出显示TextView中的单词()

文章图片

这是方法。
/** * use this method to highlight a text in TextView * * @param tvTextView or Edittext or Button (or derived from TextView) * @param textToHighlight Text to highlight */ public void setHighLightedText(TextView tv, String textToHighlight) { String tvt = tv.getText().toString(); int ofe = tvt.indexOf(textToHighlight, 0); Spannable wordToSpan = new SpannableString(tv.getText()); for (int ofs = 0; ofs < tvt.length() & & ofe != -1; ofs = ofe + 1) { ofe = tvt.indexOf(textToHighlight, ofs); if (ofe == -1) break; else { // set color here wordToSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), ofe, ofe + textToHighlight.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.setText(wordToSpan, TextView.BufferType.SPANNABLE); } } }

您可以使用check this answer获取可点击的突出显示文本。
另一答案我知道这个线程很老,但是如果有人想要在textview中突出显示字符串,我已经创建了一个完全符合这个要求的库。这是我对堆栈溢出问题的第一个答案,因为我刚刚加入,希望它的格式正确且相关。它使用SpannableString并定位您指定的所有字符串。此外,还内置了一个自定义ClickableSpan,您可以根据需要为单击的文本设置侦听器。
Linker轻量级的android库,用于突出显示textview内部的字符串(忽略大小写),带有可选的回调。
语言:java
MinSDK:17
它的功能和所有代码的图像可以找到here。
JavaDocs
要引入你的android项目实现工件:
在项目级别build.gradle中
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }

在App level build.gradle中
dependencies { implementation 'com.github.Gaineyj0349:Linker:1.2' }

如何使用:
1- 使用textview构造一个Linker对象:
Linker linker = new Linker(textView);

2- 添加要在textview文本中突出显示的数组或字符串列表:
ArrayList< String> list = new ArrayList< > (); list.add("hello"); list.add("world"); linker.addStrings(list);

AND / OR
String[] words = new String[]{"One", "Two", "Three"}; linker.addStrings(words);

3- 添加回调:(这是可选的):
linker.setListener(new LinkerListener() { @Override public void onLinkClick(String charSequenceClicked) {// charSequenceClicked is the word that was clickedToast.makeText(MainActivity.this, charSequenceClicked, Toast.LENGTH_SHORT).show(); } });

    推荐阅读