Jetpack Compose에서 ConstraintLayout을 사용하며 겪은 어려움을 공유해보려한다. (내가 Compose에 대한 사전지식이 충분하지 않은 탓이 클 것이라 생각하지만 말이다.) 내가 가장 힘들었던 부분은 제목에 적은 것처럼 match constraint 속성을 어떻게 적용해야하는가였다. match constraint라는 말이 어색할 사람들을 위해 풀어서 설명해보자면 이런 것이다. width, height를 0dp로 설정하고 View의 start, end, top, bottom에 제약 조건을 건다. 그렇게 되면 뷰가 제약 조건에 맞춰 늘어난다. 당연히 Compose에서도 그렇겠거니! 생각을 하고 Modifierdml width, height를 0.dp로 설정한 뒤 실행을 했더니 정말 그대..
이번에 소개해볼 경험은 투명 액티비티를 만들어 본 경험을 공유해보려 한다. 다른 글처럼 이 기능이 왜 필요했나 설명해보겠다. 이번 요구사항은 툴바 우상단 옵션 메뉴를 눌렀을 때, FAB(FloatingActionButton) 여러 개가 보여야 했다. 나는 당연하게도 프래그먼트를 활용해야겠다 생각했지만 액티비티 구조가 CollapsingToolbarLayout을 사용하기 위해 rootView가 CoordinatorLayout이다 보니 스크롤 시 툴바 영역이 덮이지 않는 현상이 생겼다. 이렇다보니 액티비티를 띄우는게 더 심플하겠다는 생각이 들었고, 여기서 투명 액티비티를 만들어보게 되었다. 또, 투명 액티비티가 필요했던 이유는 일반 액티비티와 다르게 옵션 메뉴를 눌렀을 때 설정 메뉴들이 FAB로 보여야했기 ..
이번 글은 안드로이드 뷰페이저를 사용하며 리사이클러뷰에서 ItemDecoration을 사용했듯 페이지 간 마진을 설정하는 방법에 대해 소개해보려 한다. 뷰페이저에서 페이지 간 마진을 주기 위해서는 먼저 뷰페이저에 PageTransformer를 설정해야 한다. 그리고 MarginPageTransformer 클래스를 사용해 생성자에 마진을 설정할 픽셀 값을 전달하면 된다. 여기서 다들 dp 단위를 사용하고 싶을테니 dp를 px단위로 변환하는 과정이 필요하다. 이젠 코드로 한 번에 살펴보자. https://gist.github.com/BonusTrack02/aed704c6c989a9345444758894c7acff ViewPager2 set page margin including dp to px convert..
저번 글까지는 DateRangePicker에 관련된 설정을 소개하는 글이었다. 이번 글에서는 DateRangePicker에서 선택한 날짜를 가져온 경험을 소개한다. 바로 짧은 코드를 첨부해본다. https://gist.github.com/BonusTrack02/f6c50a55da4ff9829f57f8578693d04c DateRangePicker PositiveListener using Material3 DateRangePicker PositiveListener using Material3. GitHub Gist: instantly share code, notes, and snippets. gist.github.com 정말 단순히 DateRangePicker에서 날짜를 선택한 뒤 저장 버튼을 눌렀을 때만..
드디어 DateRangePicker의 마지막 설정이다. 미래 날짜가 선택되지 않도록 만드는 것이 요구사항이어서 이에 맞추기 위해 설정을 찾아보았다. 바로 코드를 첨부해보도록 하겠다. 아래 코드는 이전 1, 2편에서 소개했던 설정들이 같이 적용되어 있다. https://gist.github.com/BonusTrack02/729539409ad71d862df188731d63ecf6 DateRangePicker using Material3 all custom settings DateRangePicker using Material3 all custom settings - SearchFragment.kt gist.github.com constraintsBuilder라는 변수를 통해 DateValidatorPoint..
ㅇ저번 글에서 나는 DateRangePicker가 Dialog처럼 실행되게 설정해보았다. 이번에는 2주 전 날짜부터 오늘 날짜까지 선택된 상태로 실행되는 기능을 만들어보려 한다. 오늘 날짜 및 2주 전 날짜 선택된 상태로 실행하기 DatePicker와 달리 DateRangePicker에서 사용하는 클래스가 있다. Pair 라는 녀석인데 이 녀석의 패키지는 androidx.core.util이다. 얘로 뭘하려고 할까? 시작과 종료 날짜를 지정한다. 코드를 먼저 첨부하고 설명을 이어가보겠다. https://gist.github.com/BonusTrack02/5587dfd7b87cad867f716bff4ba70575 DateRangePicker using Material3 theme and set current..
이번 글에서는 머터리얼에서 제공하는 날짜 범위 선택 기능에서 내가 사용한 몇가지 설정을 공유하려고 한다. 달력 생성 방식(?) 맨처음 문제가 되었던 녀석이다. 바로, 내가 원하던 방식은 Dialog처럼 선택기가 보이는 것이었다.(BottomSheet 관련 글에서 소개했던 Modal 방식을 원했다.) 하지만, 일반 바(bar)형 기종에서는 전체화면(액티비티같은?)으로 DateRangePicker가 실행되었다. 특이하게 폴드 기종이나 태블릿에서는 DateRangePicker가 Dialog처럼 실행되었다. 정확히 찾아보진 않았지만 머터리얼에서 휴대폰 스크린 사이즈에 따라 실행 방식을 다르게 두었다고 생각을 했고 결국 머터리얼에서 이를 제어하기 위해서는 스크린 사이즈에 따라 테마를 다르게 설정했다고 생각했다. ..
이번에 소개할 내용은 프래그먼트들에게서 키보드(SoftInput 또는 keypad)를 내리는 방법이다. (누군가 더 좋은 방법을 소개시켜준다면 기꺼이 교체할 생각이 있다.) 시작해보자. 일단 이런 동작이 필요하게 된 배경은 이러하다. 흔히 사용하는 BottomNavigationView의 메뉴 아이템을 선택해 다른 프래그먼트를 보여줘야 할 때, 이전 프래그먼트에서 입력하던 사항이 있다면 키보드를 내리면서 프래그먼트가 전환되어야 한다. 안드로이드에 익숙한 개발자라면 키보드 내리는 동작은 익숙해져 있을 것이다. 나에게 문제는 이 동작을 어디서, 얼마나 실행하느냐가 문제였다. 그래서 프래그먼트가 교체되는 ItemSelectedListener에서 실행해주었다. 여기서 기존에 모든 프래그먼트를 hide시킨 뒤, w..
이번에는 Data Access Object인 DAO를 만들어 볼 것이다. DAO는 안드로이드에서 DB의 insert, delete, update에 대한 편의성을 제공한다. Room DB를 사용할 때 코드에서 함수를 정의하고 호출하여 DB를 쿼리한다. 이러한 함수들은 SQL 쿼리들을 매핑한다. 주석(annotation)을 사용하여 DAO에 이러한 매핑을 정의하면 Room이 필요한 코드를 생성한다. DAO를 DB에 접근하기 위한 인터페이스로 생각하면 된다. 추가로, 쿼리를 생성할 때 컴파일러가 문법 에러를 검사해준다. (개인적으로 잘못된 컬럼을 조회하는 일은 적어질 거라 생각한다) sleep-tracker 데이터베이스에 아래 나열한 것들을 해야한다. night를 삽입한다. 존재하는 night에 종료 시간과 ..
오늘은 바텀시트에 이미 프로젝트에 적용되어있던 Material3 테마를 적용해본 내용을 적어본다. 먼저, 내 상황은 이렇다. 프로젝트에 Material3 테마로 색상이 정의되어 있었다. 바텀시트는 커스터마이징을 위해 별도 클래스로 작성되어 있다. (BottomSheetDialogFragment를 상속받고 있다.) 바텀시트의 버튼은 Material3 테마를 사용하지 않고 AppCompat 테마를 사용한다. 또, 프로젝트 테마의 parent는 Theme.Material3.Light.NoActionBar이다.(라이트 모드 기준) 여기서 문제가 되는 지점은 바텀시트의 parent를 누구로 지정해야 하는가 이다. BottomSheet라 검색하면 굉장히 많은 테마가 검색되는데 답을 먼저 말하면 Theme.Mater..