我知道这个线程是旧的,但以防万一有人想在 textview 中突出显示字符串,我创建了一个库来执行此操作。这是我刚刚加入的关于堆栈溢出的问题的第一个答案,希望它的格式正确且相关。它使用 SpannableString 并将定位您指定的字符串的所有出现。此外,内置的自定义 ClickableSpan 让您可以选择为单击的文本设置侦听器(如果需要)。
链接器
轻量级的 android 库,用于在 textview 中突出显示字符串(忽略大小写),带有可选的回调。
语言:Java
MinSDK:17
可以找到它的功能图片和所有代码
here.
JavaDocs
将工件引入您的 android 项目:
在项目级别的 build.gradle 中
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
在 App 级别的 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);
与/或
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 clicked
Toast.makeText(MainActivity.this, charSequenceClicked, Toast.LENGTH_SHORT).show();
}
});
4 - 调用链接器的更新方法以提交自定义并推出设置。:
linker.update();
您始终可以选择将字符串添加到链接器对象,只需确保在刷新跨度后调用更新方法即可。
linker.addStrings("yoda");
linker.update();
如果您需要具有相同链接器对象的新石板,只需调用
linker.clearLinksList()
您也可以自定义链接:
1 - 自定义所有链接颜色:
linker.setAllLinkColors(Color.BLUE);
2 - 自定义链接下划线:
linker.setAllLinkUnderline(false);
3 - 如果您希望为某个字符串自定义颜色或下划线设置(注意该字符串必须已经添加到链接器中):
linker.setLinkColorForCharSequence("world", Color.MAGENTA);
linker.setUnderlineModeForCharSequence("world", true);
4 - 如果您希望对每个单词使用不同的设置,那么您还可以为链接器对象提供一个 LinkProfile 列表或数组:
ArrayList<LinkProfile> profiles = new ArrayList<>();
profiles.add(new LinkProfile("hello world",
Color.GREEN, false));
profiles.add(new LinkProfile("goodbye cruel world",
Color.RED, false));
profiles.add(new LinkProfile("Whoa awesome!",
Color.CYAN, true));
linker.addProfiles(profiles);
记得在对链接器对象添加任何内容后调用 .update()。
请注意,库会处理一些细微的问题,例如添加两个相同的单词或单词的相同部分。例如,如果“helloworld”和“hello”是添加到链接器中的两个词,当它们在相同的字符范围内时,“helloworld”将优先于“hello”。链接器将首先根据较大的单词进行排序,并在链接它们时跟踪所有跨度 - 避免重复和相交跨度的问题。
在 MIT 许可下获得许可。