概述
最近收到一個(gè)需求就是巢音,搜索的關(guān)鍵詞鼓鲁,在搜索結(jié)果頁的搜索條目上高亮顯示。類似于支付寶搜索結(jié)果頁的效果港谊。經(jīng)過一番思慮之后骇吭,感覺還是比較簡單的,直接上代碼歧寺。
效果
image
代碼
/**
* 字符串高亮顯示部分文字
* @param textView 控件
* @param str1 要高亮顯示的文字(輸入的關(guān)鍵詞)
* @param str2 包含高亮文字的字符串
*/
private void setTextHighLight(TextView textView, String str1, String str2) {
SpannableString sp = new SpannableString(str2);
// 遍歷要顯示的文字
for (int i = 0 ; i < str1.length() ; i ++){
// 得到單個(gè)文字
String s1 = str1.charAt(i) + "";
// 判斷字符串是否包含高亮顯示的文字
if (str2.contains(s1)){
// 查找文字在字符串的下標(biāo)
int index = str2.indexOf(s1);
// 循環(huán)查找字符串中所有該文字并高亮顯示
while (index != -1) {
ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#db384c"));
sp.setSpan(colorSpan, index, index + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
// s1從這個(gè)索引往后開始第一個(gè)出現(xiàn)的位置
index = str2.indexOf(s1, index + 1);
}
}
}
// 設(shè)置控件
textView.setText(sp);
}
注意
- 為了能很好的理解代碼燥狰,代碼的關(guān)鍵位置的注釋還是比較多的,就不多用文字解釋了斜筐。
- 代碼并不是很完善龙致,根據(jù)不同的需求,可能還需要考慮中文顷链、英文目代、中文字符、以及英文字符的過濾,如果有這方面的需求可以在網(wǎng)絡(luò)上搜索一下相關(guān)的功能實(shí)現(xiàn)榛了,相關(guān)介紹還是比較多的在讶。
補(bǔ)充一
TextView設(shè)置高亮,有多種實(shí)現(xiàn)方式霜大,通過HTML构哺,SpannableString都可以實(shí)現(xiàn)。還有待總結(jié)战坤,先把遇到的情況就下來
通過正則來過濾關(guān)鍵字曙强,設(shè)置高亮。主要通過兩個(gè)類Pattern和Matcher具體代碼如下
/**
* TextView 顯示高亮
* @param view
* @param str1 要高亮顯示的文字(輸入的關(guān)鍵詞)
* @param str2 包含高亮文字的字符串
*/
private void initHighLight(TextView view, String str1, String str2) {
textView = (TextView) findViewById(R.id.textView);
SpannableString sp = new SpannableString(str2);
for (int i = 0 ; i < str1.length() ; i++){
String s = String.valueOf(str1.charAt(i));
// 正則匹配
Pattern p = Pattern.compile(s);
Matcher m = p.matcher(sp);
// 查找下一個(gè)
while (m.find()) {
// 字符開始下標(biāo)
int start = m.start();
// 字符結(jié)束下標(biāo)
int end = m.end();
// 設(shè)置高亮
sp.setSpan(new ForegroundColorSpan(Color.RED), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
view.setText(sp);
}