https://workspace-dev.medium.com/jetpack-compose-textfield-5866bdae33e7
app-snapshot-debug.apk.zip | app-latest-debug.apk.zip |
---|---|
) |
-
삼성 키보드 버전 5.4.70.33
app-snapshot-debug.apk
문제가 해결된 버전 (compose 1.3.0-alpha03, material3 1.0.0-alpha16)- material은 여전히 foundation 1.2.0을 사용하고 있고, foundation 1.3.0-alpha03 이상을 dependencies에 함께 사용해야 함. 이 줄을 제거하고
snapshot
빌드를 수행하면 여전히 문제 발생
- material은 여전히 foundation 1.2.0을 사용하고 있고, foundation 1.3.0-alpha03 이상을 dependencies에 함께 사용해야 함. 이 줄을 제거하고
app-latest-debug.apk
문제가 발생하는 가장 최신 버전 (compose 1.3.0-alpha02, material3 1.0.0-alpha15)
-
(11월 14일 추가) 삼성 키보드 버전 5.4.80.1 + compose 1.3.0-alpha03, 1.3.0, 1.4.0-alpha01, 1.4.0-alpha02 모두 잘 동작함.
내용 보기
# EditTextField텍스트 입력을 받는 컴포넌트는 앱 개발 시 기본적으로 필요한 요소입니다. View에는 EditText, TextInputLayout등이 있었고, Jetpack Compose에는 BasicTextField, TextField가 있습니다. Jetpack Compose는 Android 앱을 개발하는 새롭고 멋진 방법이지만, 치명적인 문제가 있습니다.
그것은 바로 삼성키보드 '자소 분리' 이슈입니다.
본 Repository는 Jetpack Compose의 TextField에 존재하는 한글 자소분리 문제를 쉽게 확인하고, 해결의 방향성을 제시하기 위하여 간략한 예시와 해결책을 담아 작성되었습니다.
문제는 TextField를 아래와 같이 삼성 키보드의 문구추천 Option(설정 -> 일반 -> 삼성 키보드 설정 -> 문구 추천)이 켜져있는 상태로 사용할 경우 발생합니다.
재현 방법은 다음과 같습니다.
-
한글로 여러 문자를 작성한다.
-
커서의 위치를 지금까지 작성한 문자들 사이로 이동시킵니다.
-
이어서 여러 문자를 타이핑합니다.
-
이 경우 자음과 모음이 분리되고 직접 치지 않은 글자들까지 등장하게 됩니다.
아래 영상을 통해 좀 더 확실하게 확인할 수 있습니다.
기존 Compose의 TextField | AndroidView를 사용한 CustomTextField |
---|---|
이 문제를 처음으로 발견한 후 삼성 멤버스를 통해 제보를 했습니다. Gboard는 문제가 생기지 않아 키보드 앱 이슈가 아닐까 생각했습니다.
이에 돌아온 답변은 다음과 같습니다.
답변 #1 고객님, 안녕하세요. 삼성 전자 휴대폰 담당입니다.
우선, 답변이 늦어진 점 대단히 죄송합니다. 보내주신 로그 분석 결과 Jetpack Compose Text field 에서 commit 수행 직후
getTextBeforeCursor
에 대한 리턴을 정상적으로 해주지 않은 것으로 보여집니다. 예를 들어 "Hellp" 입력 후 space 로 자동교체 동작시켜 "Hello" 가 실제로 입력될 경우getTextBeforeCursor
는 "Hellp" 를 리턴하였고 "안녕" 이후에 'ㅇ' commit 할 경우getTextBeforeCursor
가 "안녕ㅇ" 이 아닌 "안녕" 으로 리턴을 해준 것으로 보여집니다.수행 순서로 보면 실제 입력 "안녕ㅇ",
getTextBeforeCursor
는 "안녕" 리턴 하였고 이후에 'ㅏ' 입력 → 앞에 글자를 "안녕" 으로 리턴해주기 때문에 'ㅏ' 와 조합 시 "안녕ㅏ" 가 된 것으로 보여집니다.또한 before text length 를 2글자("안녕") 로 잘 못 알게 되어 "안녕ㅇ하세요" 상황에서 before text length 2글자만큼 지우고 "안녕ㅏ" 를 결과적으로 "안안녕ㅏ하세요" 로 잘 못 입력된 것으로 보여집니다. 정상적으로 입력되는 경우 실제 입력 "안녕ㅇ",
getTextBeforeCursor
는 "안녕ㅇ" 리턴되어 이후에 'ㅏ' 입력 → 앞에 글자를 "안녕ㅇ" 으로 리턴해주기 때문에 'ㅏ' 와 조합 시 "안녕아" 가 되며 또한 before text length 가 3글자("안녕ㅇ") "안녕ㅇ하세요" 상황에서 before text length 3글자만큼 지우고 "안녕아" 를 결과적으로 "안녕아하세요" 로 의도대로 정상 입력 됩니다.외부 앱 키보드
- Swiftkey 키보드 "안녕하세요" 입력 후 space 띄어쓰기 이후 "안녕" "하세요" 사이로 커서 이동 시 다시 "안녕하세요" 뒤로 커서 자동변경 되는 이슈가 있습니다.
- Gboard 문제가 발생하지 않음 → Gboard 는 reselection 을 지원하지 않아 입력 중인 글자로만 추천어를 만들어 줍니다. 사용에 참고 부탁드립니다. 감사합니다.
답변 #2 중복 제거하고 추가 사항
(중략) 구글에서 API를 공식적으로 만들게 되면 Device Vendor(Samsung과 같은)에게
Android Compatibility Definition
을 통해서 API의 호환성 정의를 합니다. 그런데 이에 대해 Definition 요구가 없었습니다. ...
https://issuetracker.google.com/u/2/issues/195231205
Google 측에도 Issue Tracker를 통해 제보했습니다. 오랜 기간 답이 없다가, 영어 사용 시에도 비슷한 이슈가 생겼고 이 이슈가 함께 처리 되었습니다. 그러나, 온전하게 해결되지 않고 타이밍 이슈 같다는 의견과 함께 아무런 진전이 없는 상태입니다. 삼성 측으로부터 받은 답변을 전달했으나 추가 답변은 없었습니다.
다행히 AndroidView를 통해 EditText를 사용할 수 있었습니다. 이런 식으로도 사용할 수 있다는 것을 보여주기 위해 간단한 sample을 작성해뒀습니다. 실제 저희 앱에서 쓰는 CustomTextField는 요구사항이 더 있어서 focus, styling등 부가적인 구현을 해둔 것이 있으니, 상황에 맞게 커스터마이징 하시면 될 것 같습니다!
## 마치며 이 이슈는 Compose 출시 전 부터 현재 기준 최신 버전인 1.3.0-alpha01까지 해결되지 않은 문제입니다. 저희 서비스 내 운영 중인 [](https://holix.com/c/OnwYAkw8)와 GDG 커뮤니티 등에서 이야기 한 적이 있었는데, 좀 더 본격적으로 함께 고민해보고자 이 repository를 준비했습니다.
이미 많은 곳에서 Compose를 도입하신 것으로 알고 있는데, 이 이슈를 해결할 수 있는 방법이 있다면 github 이슈로 남겨주시거나, pr 부탁 드립니다.
감사합니다.
HOLIX Android Team