한 5일정도 Editor에 관한 기능들을 구현하는 중이고, 지금까지의 결과와 구현시 애로사항에 대하여 적어보겠다.
지금까지 Underline Span을 제외한 Italic, Bold 스타일을 주는 기능은 90%이상 구현이 완료되었다. 앞으로는 자잘한 버그만 수정하면 된다.
이유는 모르겠지만, 에뮬레이터에서는 잘되던게 실기기에서는 안되고, 실기기에서는 잘 되던게 에뮬레이터에서 잘 안되는 상황이 가끔 발생. 웃기점은 이전에는 되다가 갑자기 안되거나 이 반대의 상황이 벌어지기도 한다는 것.
span을 줄때 숫자와 문자가 약간 다른 취급을 받는다는 것도 알 수 있었다.
일단 에디터의 주요 기능및 알고리즘
1. 문자열 선택후 Bold, Italic, Underline 버튼 누르면 각각 맞추어서 Span들어감
2. 문자열 선택시, 선택한 문자열에 공통적으로 적용되어있는 Span을 보여주기
3. 2번과 비슷하게 커서 위치 이전의 글씨 Style을 유저에게 피드백 제공
4. 그냥 Bold, Italic, Underline 주기
사실 기능만 보면 별게 없긴 하다. 하지만 구현하는데에는 연구가 좀 필요했다.
Style을 주는 방법부터 생각해보자.
SpannableStringBuilder를 이용하는것과 Editable 그 자체를 이용하는 것, 2가지 방법이 존재한다.
구글 문서에서 문자열이 바뀌거나 추가되면 Builder를 활용하라고 했지만, 이는 한글에서는 문제가 발생한다.
TextWatcher를 구현해 EditText의 내용이 바뀔 때 마다, 현재 유저가 선택한 Style을 지정해주어야 하지만,
예를 들어,
1) 문자열 바뀜 Call
2) Builder에 바뀐 문자열 스타일을 지정하고 추가
3) 다시 화면에 그려줌
을 해줄 경우에 1) 문자열 바뀜 Call이 한글 자음 모음 한글자씩 입력될때마다 Call 되기 때문에 자모를 조합할 수가 없었다. 유니코드까지 사용해서 뭐 한다면, 방법이 존재는 하겠지만, 이 방법은 너무나도 복잡한 것 같았다.
이제 Editable 이 자체에서 setSpan을 해주는 경우이다.
TextWatcher에서 onTextChaned() 안에서 한글자씩 Exclusive_Exclusive로 Flag를 설정하여 Span을 주면 되는데,
문제는 저 Exclusive_Exclusive로 설정을 해도 글을 이어서 쓰고 있으면, 유저가 Bold상태로 글을쓰다 Bold를 해제해도 Bold상태가 지속된다!
위 사진처럼 이어서 쓰면 글자 밑에 밑줄이 생긴다. 이걸 캐치를 하는데 좀 오래 걸려서... 그래서 나는 해결을 Style 버튼을 누르면 커서를 뒤로 한칸 앞으로 한칸 옮겨주는 작업을 하여 저 밑줄을 사라지게 만들어 줬다.
굵게 처리 했는데, 진짜 저 단순한거 하나때문에 엄청나게 고민했다.
마지막으로 맨 위에서 말한 2,3번 기능(유저에게 피드백 제공)은 onSelectionchangedListener를 구현해 줘야하는데, 이게 순정 EditText로는 안돼서 EditText의 자식 클래스를 하나 만들어주어 구현했다. 왜 막아놓았는지는 모르겠다.
해결방법인 커서를 한칸 뒤로, 다시 앞으로때문에 onSelectionChangedListner도 작동해서 이부분 예외처리까지 해주고, 신경쓸게 참 많다..
'Android' 카테고리의 다른 글
Android Span에 관한 몇가지 고찰들 (0) | 2020.07.15 |
---|---|
[앱개발 일지] 일기장 앱 #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 |