티스토리 뷰

Android Memo

검색어 하이라이트 처리

DevSSAM 2022. 11. 22. 17:26

리스트를 검색할 때 실시간으로 해당 검색어에 해당하는 목록을 보여주며

리스트에 있는 문자열에  검색어를 하이라이트 처리 해야할 경우가 있다.

리컬시브 동작으로 간단하게 짜 보았다.

 

private fun startSearchHighlight(tv: TextView, fullString: String, searchString: String, isCaseSensitive: Boolean) {
	var fullStr: String = fullString
	var searchStr: String = searchString
	if( !isCaseSensitive ) { // 대소문자 구분 필요없을 때
		fullStr = fullString.lowercase(Locale.US)
		searchStr = searchString.lowercase(Locale.US)
	}
	val startIdx: Int = fullStr.indexOf(searchStr)
	if (startIdx == -1 || searchString.isBlank() ) {
		// 검색어가 없거나 일치하는 결과가 없을 경우 원래 색으로 원복
		tv.text = fullString
		return
	}

	val sp: Spannable = SpannableString(fullString)
	val endIdx = startIdx + searchString.length
	val colorValue = // 원하는 컬러 값 세팅
	// 재귀함수로 해당 문자열에서 검색어 찾기
	recursiveSpannable(fullString, searchString, sp, startIdx, endIdx, colorValue, isCaseSensitive)
	tv.text = sp
}

private fun recursiveSpannable(fullString: String, searchString: String, sp: Spannable, startIdx: Int, endIdx: Int, colorValue: Int, , isCaseSensitive: Boolean) {
	var fullStr: String = fullString
	var searchStr: String = searchString
	if( !isCaseSensitive ) { // 대소문자 구분 필요없을 때
		fullStr = fullString.lowercase(Locale.US)
		searchStr = searchString.lowercase(Locale.US)
	}
	val subStartIdx: Int = fullStr.indexOf(searchStr, endIdx)
	if (startIdx != -1) {
		val subEndIdx: Int = subStartIdx + searchString.length
		recursiveSpannable(fullString, searchString, sp, subStartIdx, subEndIdx, colorValue, isCaseSensitive)
		sp.setSpan(ForegroundColorSpan(colorValue), startIdx, endIdx, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
	}
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함