Jetpack Compose UI

Jetpack Compose 나만의 TextField 만들기

BasicTextField 활용

Ji Sungbin
성빈랜드

--

[View in English]

Photo by Muhammad Nasir on Unsplash

컴포즈는 기본 디자인 시스템이 Material 으로 돼있습니다. 따라서 미리 정의된 TextField 를 사용하면 Material 디자인 스펙에 맞춰지므로 커스터마이징에 제한이 생깁니다.

TextField 는 기본 높이와 배경 색이 설정돼 있어서 관련 Modifier 를 적용해 주지 않아도 긴 높이와 회색 배경이 보이는 걸 확인할 수 있습니다. 하지만 TextField 와 달리 BasicTextField 는 설정한 Modifier 의외의 옵션은 보이지 않습니다(텍스트가 표시되기 위한 최소한의 높이 제외).

BasicTextField 는 Material 에 영향을 받지 않는 foundation 아티팩트에 위치합니다. 즉, BasicTextField 를 활용하면 Material 디자인 스펙의 제약 없이 자유롭게 커스터마이징 할 수 있습니다.

BasicTextFielddecorationBox 라는 새로운 인자가 존재합니다. 이 인자를 통해 TextField 를 자유롭게 꾸밀 수 있으며, 이로 꾸며진 형태가 TextField 가 됩니다.

BasicTextField 는 2가지 요소로 나뉩니다.

  • 클릭 시 키보드를 열고, 입력받은 텍스트로 onValueChange 를 호출하는 요소
  • value 를 화면에 표시하는 요소

첫 번째 요소는 BasicTextField 자체가 담당하고, 두 번째 요소를 decorationBox 가 담당합니다. 이를 증명하기 위해 decorationBox 인자를 {} 으로 설정해 보겠습니다.

BasicTextField 에는 text 가 표시되지 않고 직접 text 를 표시해 주는 Text 에만 text 가 표시됨을 확인할 수 있습니다.

이를 응용해서 아래 화면에 사용되는 TextField 를 임시로 구현해 보겠습니다.

아래는 제가 참여중인 사이드 프로젝트인 덕키의 한 화면 입니다! 2월에 MVP 출시 예정이니 많은 관심 부탁드려요 🫶

입력받은 텍스트를 Box 안에 보여주는 식으로 decorationBox 를 구성해 보았습니다. 하지만, 이 방식은 사용자 지정 decorationBox 이기에 키보드 커서가 보이지 않습니다. 키보드 커서를 표시하기 위해선 decorationBox 에 기본 인자로 주어지는 innerTextField 를 활용해야 합니다. 이를 활용해서 아래 화면속 TextField 를 임시로 구현해 보겠습니다.

이런 식으로 간단히 구현할 수 있습니다.

끝!

decorationBox 를 활용하면 거의 모든 TextField 디자인을 구현할 수 있습니다. 끝까지 읽어주셔서 감사합니다.

안드로이드 개발자분들을 위한 카카오톡 오픈 채팅방을 운영하고 있습니다. 오늘 인원 정리가 진행될 예정입니다. 그동안 자리가 없어서 못 들어오셨던 분들은 이제 들어오실 수 있습니다.

--

--

Ji Sungbin
성빈랜드

Experience Engineers for us. I love development that creates references.