일모도원(日暮途遠) 개발자
[Android] SPAN_EXCLUSIVE_INCLUSIVE 본문
텍스트의 색상을 변경할때 Span을 사용하는데, setSpan메소드를 보면 flags라는게 있다.
public void setSpan(Object what, int start, int end, int flags) {
이 flags에는 많은 값들이 있는데 다음과 같이 비슷하게 생긴것들이 있다.
https://developer.android.com/reference/android/text/Spanned?hl=ko
Spannable.SPAN_INCLUSIVE_INCLUSIVE
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
이 flags들은 span을 적용할 텍스트가 변경될때에만 효과를 가진다. 즉 주어진 텍스트에 색상만 바꿀때는 아무런 효과가 없고, 주어진 텍스트에 스팬을 적용한후에 스팬에 텍스트를 추가했을때 flag값들에 따라서 추가된 텍스트에 span에 적용된 효과를 같이 적용한다.
예를 들어서 위에서 O인 글자를 찾아서 빨간색으로 칠하는 소스가 있다고 하자. 이때는 텍스트에 변경이 없을때에는 Spannable.SPAN_INCLUSIVE_INCLUSIVE옵션은 아무거나 줘도 상관없다.
다음 코드를 보면 적용한 스팬(setSpan)의 앞뒤로 텍스트를 삽입하는게 아니라서 텍스트가 변경이 되는것이 아니라서 SpannableStringBuilder를 쓰지 않고 SpannableString를 사용했다.
public static SpannableString getSpanColor(String string, String keyword, int color) {
SpannableString spanString = new SpannableString(string);
Pattern p = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(string);
if (m.find()){
spanString.setSpan(new ForegroundColorSpan(color), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
return spanString;
}
//아래처럼 사용함.
//myTextView.setText(getSpanColor(string, keyword, Color.RED))
근데 만약 검색된 결과 (span을 적용한곳) 앞뒤로 문자를 추가하고 싶다고 하자.
다음 코드는 keyword를 찾아서 빨간색 span을 적용하고, span의 시작부분에는 "(s)"라는 글자를 삽입했고, span의 끝부분은 "[e]"를 삽입했다.
public static SpannableStringBuilder getSpanColorOnKeyword(String string, String keyword, int color) {
SpannableStringBuilder spanString = new SpannableStringBuilder(string);
Pattern p = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(string);
if (m.find()){
spanString.setSpan(new ForegroundColorSpan(color), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
spanString.insert(m.start(), "(s)");
spanString.insert(m.end() + 3, "[e]");
}
return spanString;
}
keyword를 "o"로 줬을때
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
앞쪽에 추가된 글자는 Span적용을 안함. SPAN_EXCLUSIVE_EXCLUSIVE
뒷쪽에 추가된 글자는 Span적용을 안함. SPAN_EXCLUSIVE_EXCLUSIVE
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
앞쪽에 추가된 글자는 Span적용을 안함. SPAN_EXCLUSIVE_INCLUSIVE
뒷쪽에 추가된 글자는 Span적용을 함. SPAN_EXCLUSIVE_INCLUSIVE
(뒷쪽에 추가된 글자도 빨간색으로 칠해짐)
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
앞쪽에 추가된 글자는 Span적용을 함. SPAN_INCLUSIVE_EXCLUSIVE
뒷쪽에 추가된 글자는 Span적용을 안함. SPAN_INCLUSIVE_EXCLUSIVE
(앞쪽에 추가된 글자도 빨간색으로 칠해짐)
Spannable.SPAN_INCLUSIVE_INCLUSIVE
앞쪽에 추가된 글자는 Span적용을 함. SPAN_INCLUSIVE_EXCLUSIVE
뒷쪽에 추가된 글자는 Span적용을 함. SPAN_INCLUSIVE_EXCLUSIVE
(앞쪽, 뒷쪽에 추가된 글자 전부다 빨간색으로 칠해짐)
'안드로이드 개발 > 안드로이드' 카테고리의 다른 글
[Android] 웹브라우저에서 텍스트 선택후 앱 열기 (0) | 2023.02.13 |
---|---|
[Android] 텍스트 꾸미기 (Span) (0) | 2022.12.29 |
[Android] android:id="@+id"에서 +의 뜻 (1) | 2022.09.08 |
[안드로이드] 앱 구글플레이에 업데이트 제출하기 (0) | 2022.08.04 |
[Android] 제일 처음 실행되는 액티비티 찾기 (0) | 2022.07.01 |