본문 바로가기

Dev/안드로이드

(20)
Compose 내에서 ConstraintLayout 사용하기, 컴포넌트 크기가 제약 범위 초과할 때 📌 필요했던 레이아웃 대략 이런 형태의 컴포넌트가 필요했는데, 이게 자식 컴포넌트 measuring과 실제 배치의 순서 때문에 만들기가 까다로웠다. 처음 시도한 것은 왼쪽의 책 컴포넌트와 오른쪽의 코멘트 및 작성 날짜가 담긴 Column을 한 Row에 배치하는 형태였는데, 이게 어디하나 사이즈를 고정해놓은 것이 아니라서 쉽지 않았다. Row의 height이 책 컴포넌트의 height을 wrap 하는 크기로 고정되고 우측의 column은 그 크기까지만 펼쳐지길 바랐는데, column에 fillMaxHeight()을 쓰면 바로 최대 높이로 커져버리고, 내부의 내용 Text에만 weight를 1f로 주는 방법도 사용해보았지만 결과는 같았다. 저 날짜는 제일 아래 쪽에 위치해야 하고, 내용은 위에서부터 날짜를..
Compose에서 RatingBar 직접 구현하기 안드로이드는 기본적으로 RatingBar라는 View를 제공한다. 그래서 별점을 부여하는 UI를 구성할 때 어려울 것 없이 해당 View를 바탕으로 구현하면 된다. 하지만 그것은 View와 Xml 기반으로 UI를 작성할 때의 이야기고, Compose의 기본 컴포넌트에는 RatingBar 유형의 컴포넌트가 존재하지 않는다. 물론 AndroidView를 통해서 기존의 View 시스템을 부분적으로 적용해서 쓰는 방법도 좋은 방법이겠지만, 직접 구현해보면 좋은 경험이 될 것 같아서 이번엔 Composable을 직접 만들어 사용했다.   📝 구상  먼저 대략적인 디자인과 동작부터 생각했다. 이건 완성한 컴포넌트의 Preview긴 하지만, 처음 구상했던 디자인과 별반 차이는 없다. 동작이 중요했는데, 유저와의 상..
상위 Composable이 관리하는 State 주입 받아 이용하는 Modifier 내 로직이 계속 초기 값을 레퍼런싱 할 때 개인 프로젝트에 드래그 가능하고 탭도 가능한 RatingBar가 필요해서 커스텀 중인데, 꽤 쉽지가 않았다. 안드로이드 View 위젯들을 사용할 때는 RatingBar가 따로 있었으나, Compose에는 유사한 기본 Composable이 제공되지 않아 커스텀해야 했다. 그래도 얼추 드래그와 탭을 모두 구현해 두고, 이를 블로그에 쓰려고 테스트해보고 있었는데 문제가 발생했다.   구조 및 증상  일단 RatingBar Composable에 rating 값과 onRatingChanged 콜백이 전달되는데, 이 rating 값은 하위 컴포넌트들에 전달되어서 적절하게 별점을 그리기 위해 사용되며, 드래그 제스처와 탭 제스처는 onRatingChanged를 트리거한다.    이를 테스트해 보기 위해서 Previe..
Compose TextField 이용할 때 소프트 키보드와 포커스 처리하기 혼자 진행 중인 프로젝트를 한참 만들어 나가다가, 오랜만에 사소하게나마 새로 알게 된 것이 생겼다. 프로젝트 내에서 TextField를 이용해 커스텀한 SearchBar composable을 만들게 되었는데, 막히는 부분이 생겼다.   나는 위의 상태였던 SearchBar가 포커스를 얻으면(정확히는 처음 포커스를 얻는 순간이다) 아래의 형태로 바뀌어야 하고, 또 저 백버튼을 누르면 다시 위의 형태로 돌아가는 형태로 디자인을 하려고 했다. 그 과정에서 몇몇 동작처리를 직접해주어야 했는데, 처음 포커스를 얻을 때 트리거 되는 부분은 TextField 내의 modifier에 clickable 값을 줘서 해결했지만 나머지가 문제였다.  XML 및 바인딩 기반 View였다면, EditText 객체와 InputMe..
Cannot figure out how to save this field into database. You can consider adding a type converter for it. 오류 및 Room과 Enum 타입 평소처럼 Room을 사용 중이었는데, DB에 내가 만든 Entity의 필드를 저장할 수 없다는 오류가 떴다. 분명히 나는 DB에서 기본적으로 지원하는 타입의 필드들만 사용한 것 같은데 좀 당황스러웠다.   의심되는 것은 물론 Date 타입이었다. 예전에 MySql을 이용할 때는 타임스탬프를 넣을 수 있었던 것 같은데, 내가 잘못 기억하는 것인지 Room에서만 지원하지 않는 것인지 좀 헷갈렸다. 그래서 혹시나 해서 공식 문서를 뒤적거리다 보니까 이런 게 떡하니 적혀있었다.   TypeConverter를 사용해야 하는 복잡한 데이터 타입으로, Date를 예시로 들고 있다... 처음엔 그냥 직접 리눅스 시간으로 변환해서 넣고 타입을 Long으로 바꿀까하다가, 그래도 공식 문서 권장사항은 따라야지 싶어서 Typ..
Unable to load class 'org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData' 오류 Unable to load class 'org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData' Compose나 ksp 같은 비교적 최신 기술들을 적용해 개인 프로젝트를 해보고 있는데, gradle 파일에서 dependency를 추가하다가 위와 같은 오류가 발생했다. 아무래도 ksp의 버전을 공식문서 그대로 사용했더니, 다른 빌드 환경에 호환되지 않는 부분이 있었던 것 같다.   내가 설정했던 ksp 버전은 위와 같은데, 일단 공식 문서에서 안내하는대로 먼저 내 코틀린 버전과의 호환부터 체크해보기로 했다.  쭉 살펴보니 코틀린 버전과, ksp 버전의 앞쪽 버전 넘버가 맞아야 동작하는듯 했다. 코틀린 1.9.0에 대응하는 버전은 아무래도 1.0..
[TIL] 24.06.05 안드로이드 스튜디오 에뮬레이터 Extended Contorls의 location이 제대로 동작하지 않을 때 안드로이드 스튜디오의 에뮬레이터의 Extended Controls 패널을 보면 저렇게 Location을 설정하고, Route를 play 할 수 있는 기능도 지원한다. 그런데 오늘 지도 API를 테스트 하려고 해당 기능을 오랜만에 동작시켰는데 저 하얗게 표시한 부분에 지도가 제대로 뜨지 않았다. 지도의 메뉴(검색, 줌 인/아웃 버튼)는 뜨는 상태인데, 지도는 정상적으로 로드되지 않고 그냥 흰 화면만 뜨는 상태였다.  당최 이유를 알 수 없어서 꽤나 고생을 했다. 당연히 안드로이드 스튜디오와 에뮬레이터 재부팅은 해봤고, 캐시도 날려봤지만 지도가 뜨지 않았다. 처음에는 에뮬레이터 내에 연동된 구글 시스템에 문제가 있나 싶어서, 구글 계정을 다시 로그인 해보고 구글 맵을 켜서 위치 정보를 확인했더니 그 곳에서는..
[TIL] 24.06.04 Firebase의 Realtime Database와 Cloud Firestore 최종 프로젝트를 한창 진행 중에 있는데, Firebase를 이용한 원격 DB를 도입하게 되면서 고민해야 하는 부분이 생겼다.처음에 당연히 DB의 변화를 실시간으로 감지해서 UI에 변화를 발생시켜야 하는 부분이 많을 줄 알고(일종의 flow를 내려주는 격), Realtime Database를 채택했는데 앱의 윤곽이 잡히고 나니 생각보다 그런 부분이 적은듯 했다. 그래서 어떤 것을 도입할 지 공식문서를 읽어보면서, 확실하게 결정해서 리팩터링을 진행하기로 했다.Choose a database: Cloud Firestore or Realtime Database  |  Firebase (google.com) 데이터베이스 선택: Cloud Firestore 또는 실시간 데이터베이스  |  Firebase5월 14일..