幼敏悟过人,读书辄成诵。这篇文章主要讲述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)另一答案试试这个库Android TextHighlighter。
从以下版本开始:API Level 1设置TextView的字符串值。 TextView不接受类似HTML的格式,您可以使用XML资源文件中的文本字符串。要设置字符串样式,请将android.text.style。*对象附加到SpannableString,或者参阅可用资源类型文档以获取在XML资源文件中设置格式化文本的示例。
http://developer.android.com/reference/android/widget/TextView.html
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
文章图片
这是方法。
/**
* 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(); } });
推荐阅读
- 特定号码的SMS消息未显示在其他Android设备上
- 带网格标题的Android网格视图
- 使用Material Design在Android Lollipop中的ListView中的活动过渡动画
- 如何解决Visual Studio Form Render异常(可以设计Form类,但不是文件中的第一类)
- 如何在WinForms中使用C#在Windows的System32目录中运行任何可执行文件
- 跨平台与单平台开发-这是你应该知道的
- 如何确定数字在C中是否强
- PHP 7.3提供的主要功能
- 如何解决C#异常(必须先将当前线程设置为单线程单元(STA)模式,然后才能进行OLE调用,请确保你的Main函数已在其上标记了STAThreadAttribute)