Editor를 하나 만드는 중이다. 실제로 이 에디터가 지금 개발중인 앱에 들어갈지는 모르겠지만, 지금까지 git에 공개된 에디터들을 보면 모두 Html을 파싱해서 만드는 것 같지만, 본인은 웹쪽은 거의 지식이 없기 때문에 Span으로 한번 해결해 보고자 했다. 그래서 몇일간 많은 시도를 해보며 알아낸 것들을 기술 해보려고 한다.
에디터를 만드는 것은 상상외로 까다롭게 될 것 같다.
1. SPAN_EXCLUSIVE_INCLUSIVE 가 대체 뭘까?
exclusive는 속성 확장 X , inclusive는 속성을 확장한다는 뜻이다. 만약 위의 ex_in 속성을 주고 뒤에 문자를 insert 하면 설정한 속성이 뒤에도 유지된다는 것. 만약 중간에 삽입하게 된다면, 속성 상관없이 주위의 속성을 따라감. 아래 그림으로 한눈에 설명이 가능하다. 여기서 X는 삽입된 문자.
2. getSpan() 메서드의 활용법
getSpan()의 활용법이 없어서 적는다. getSpan(int start, int end, ClassType)으로 정의되있는 이 메서드는 다음과 같이 쓸 수 있다.
StyleSpan 클래스는 Bold,Italic,Normal 세가지의 효과만을 가지고 있기에 만약 Underline을 가지고 오고 싶다면 Underline클래스로 인자를 넣어주고 받으면 될 것이다. 그리고 인자로 넣어준 효과가 없다면 배열의 길이가 0으로 받아지는 것을 이용하여 체크 할 수 있을 것이다.
3. Typeface.Normal은 아무효과가 없다.
가장 이해가 안되는 부분이다. 이 부분때문에 삽질을 꽤나 했다.
editable.setSpan(new StyleSpan(Typeface.Normal),1,5,Span_Flag) 이렇게 해도, 아무일도 일어나지 않는다!
그렇기 때문에, 지금까지 알아낸 방법으로는 bold를 normal로 바꾸고 싶어도 span으로 바꿀 수는 없고 처음에 span을 줄때 한글자 한글자씩 주고 글자당 span을 한개씩 가져와서 지우는 수밖에.. 없다
만약 setSpan에서 광범위한 위치로 스팬을 주었다고 가정하고 그 일부분의 스팬을 가지고 와도 가지고 오는 스팬은 하나이기 때문에 일부분만 지워도 전체의 속성이 사라진다.
4. setSpan에서 start와 end에 대하여
start와 end는 글자의 위치가 아닌 커서 (|) 의 위치다.
만약 setSpan(빨간색,1,3)이라고 했다면 3글자가 처리되는 것이 아니다.
위 그림처럼 커서 위치 1~3사이의 2글자가 빨간색으로 바뀌는 것이다.
'Android' 카테고리의 다른 글
안드로이드 앱 개발일지 #2 Editor를 만들며 (0) | 2020.07.20 |
---|---|
[앱개발 일지] 일기장 앱 #1 (0) | 2020.07.15 |
안드로이드 EditText 프리징 관련 문제 해결 (1) | 2020.07.14 |
안드로이드 ripple effect (0) | 2020.02.11 |
안드로이드 The style on this component requires your app theme to be Theme.AppCompat 에러 해결 (0) | 2020.02.11 |