android (172) 썸네일형 리스트형 [Compose] 커스텀 TopAppBarScrollBehavior 구현하기 - 부분 렌더링 없는 부드러운 숨김/표시 필자가 회사에서 RecyclerView와 Compose를 혼합하여 사용하는 프로젝트를 진행하던 중, TopAppBar가 스크롤에 따라 숨겨지거나 나타나는 동작을 구현해야 하는 상황이 있었다. Compose에서 기본 제공하는 TopAppBarDefaults.enterAlwaysScrollBehavior()를 사용해봤지만, RecyclerView의 스크롤 이벤트와 연동할 때 TopAppBar가 반쯤 걸친 상태로 멈추는 부분 렌더링 문제가 발생하였다.이 문제를 해결하기 위해 TopAppBarScrollBehavior를 직접 커스텀으로 구현하는 방법을 찾게 되었고, 단계별로 개선하면서 최종적으로 부드럽고 안정적인 구현에 도달하게 되었다. 이번 글에서는 커스텀 TopAppBarScrollBehavior를 3단계에.. [Compose] Compose 1.10 retain API로 ViewModel 없이 상태를 보존하는 방법 필자가 Compose 프로젝트에서 상태 관리를 할 때, 대부분의 경우 ViewModel을 사용해왔다. 화면 회전 같은 Configuration Change에서 상태를 보존하려면 사실상 ViewModel이 유일한 선택지였기 때문이다. 그런데 Compose 1.10에서 retain API라는 것이 도입되면서, ViewModel 없이도 Configuration Change에서 상태를 보존할 수 있게 되었다는 소식을 접하게 되었다.처음에는 "ViewModel을 왜 대체해야 하지?"라는 생각이 들었지만, retain API의 구조를 살펴보니 ViewModel이 가지고 있던 불필요한 보일러플레이트를 상당 부분 줄여주는 것을 확인할 수 있었다. 이번 글에서는 retain API가 무엇인지, ViewModel과 어떤 .. [Compose] CompositionLocal의 Composition Tree 동작 원리를 시각화해보자 필자가 Compose 프로젝트를 진행하면서 CompositionLocal을 자주 사용하게 되었는데, 사용법 자체는 익숙해졌지만 내부적으로 데이터가 어떻게 전달되는지에 대해서는 막연하게만 이해하고 있었다. "Provider로 감싸면 자식이 쓸 수 있다" 정도로만 알고 있었던 것이다. 그러다 Composition Tree 관점에서 CompositionLocal의 동작을 설명하는 글을 보게 되었고, 실제로 데이터가 자식에게 복사되는 것이 아니라 룩업으로 찾는다는 사실을 알게 되었다.이번 글에서는 CompositionLocal이 Composition Tree에서 어떻게 동작하는지를 4가지 관점에서 정리해보고자 한다. 트리 구조, 룩업 메커니즘, 섀도잉, 그리고 리컴포지션 범위까지 단계별로 살펴볼 예정이다.Com.. [Android] Android의 Embedded Photo Picker를 알아보자 필자가 실무에서 사진 선택 기능을 구현하다 보면, 기존의 Photo Picker는 전체 화면으로 전환되기 때문에 사용자가 앱을 벗어나는 느낌을 줄 수밖에 없었다. 이런 부분에서 항상 아쉬움을 느끼고 있었는데, Android에서 Embedded Photo Picker라는 것을 제공하기 시작했다는 것을 알게 되었다.이번 글에서는 Embedded Photo Picker의 개념과 주요 API, 그리고 동일한 UX 패턴을 Compose로 직접 구현한 4가지 데모에 대하여 작성해보고자 한다.Embedded Photo Picker란?Embedded Photo Picker는 기존의 전체 화면 Photo Picker와 달리, 앱의 UI 안에 직접 임베드되어 사용자가 앱을 떠나지 않고도 사진과 영상을 선택할 수 있게 해주.. [Android] Compose NestedScroll 완벽 분석 - 실시간 스크롤 처리 순서 시각화 Jetpack Compose에서 복잡한 스크롤 동작을 구현할 때 NestedScrollConnection을 사용하는 경우가 많다. 하지만 필자는 이 API의 동작 순서와 각 함수를 어떻게 호출해서 활용해야하는지 정확히 이해하기는 쉽지가 않았다.따라서, 이번 글에서는 실시간으로 스크롤 처리 과정을 시각화하여 NestedScroll의 동작 원리를 완벽하게 파악할 수 있는 예제를 구현해 NestedScroll이 어떻게 동작하는지 알아보도록 하자.우선,NestedScrollConnection을 사용하는 방식은 다음과 같이 아주 간단하기 때문에 사용 방식은 넘어가도록 하겠다.Box( modifier = Modifier .fillMaxSize() .nestedScroll(nestedS.. [Android] Compose에서 런타임 언어 변경 구현하기 - 앱 재시작 없이 실시간 적용 안드로이드 앱을 개발하다 보면 사용자가 앱 내에서 언어를 변경할 수 있는 기능이 필요한 경우가 있다. 특히 글로벌 서비스라면 필수적인 기능이기도 하다.하지만 단순히 시스템 언어를 변경하는 것이 아니라, 앱 내에서 독립적으로 언어를 변경하고 즉시 적용되어야 하는 경우에는 몇 가지 구현 방법을 고려해야 한다. 이번 글에서는 Jetpack Compose 환경에서 런타임 언어 변경을 구현하는 방법을 간단하게 구현해 보았다.우선,기본적으로 앱을 실행시킨 다음, 디바이스의 언어를 변경 후 앱을 재 접근하게 되면 앱이 재 실행되면서 새로운 언어 리소스를 참조하여 보이게 된다. 필자는 이런 것이 아닌, 디바이스의 언어를 건들지 않고 앱 자체의 언어만을 변경하고 싶었다.따라서, 이런 방식을 어떻게 구현하면 좋을까 생각.. [Android] Compose 환경에서 데이터 init 방식에 대한 고찰. 최근 안드로이드 뉴스레터, 그리고 개발자 카톡방 등에서 초기 데이터 init 방식에 대한 글을 종종 봤다.필자는 샘플에는 init 되는 타이밍이 한정적이고 예제이기 때문에 정말 가장 간단한 방식으로 설정하긴 했지만, 실무를 진행할 때는 2가지 방법을 나눠서 사용한 경험이 있다. 하지만, 위의 내용을 보고 확인을 하다 보니 안드로이드 쪽에서 유명한 Skydoves님의 글을 보고 새로운 init 방식에 대해 알게 되었다.본 글에는 기존에 사용하던 방식과 더불어, 새롭게 Skydoves님의 방식을 작성해 보면서 그 장단점을 생각해보고자 한다.우선,필자가 사용했던 2가지 방식에 대해 설명하고자 한다. 첫 번째 방식은 LaunchedEffect를 사용하여 데이터를 초기화 하는 방식이다.LaunchedEffect(.. [Cursor] Cursor IDE 0.50, 0.49 업데이트에 대해 알아보자. Cursor IDE를 사용하다 보면, 좌측 하단에 작은 창으로 update를 할 거냐고 물어보는 경우가 생각보다 자주 발생한다.하지만 창이 작아서 일까? 필자는 업데이트를 봐도 바로 최신 버전으로 업데이트를 하지 않고 사용하다가 가끔씩 업데이트를 진행하곤 했다. 그리고 개발자 동료로부터 최신 업데이트에 이것저것 쓸만한 것들이 많이 추가되었다고 전해 듣고 업데이트를 해보니 생각보다 추가된 것들이 많은 것을 볼 수 있었다. 이번 글에서는 최근에 업데이트 되었고, 0.50 버전과 0.49 버전에서 변경된 사항들 중에서, 필자가 생각하기에 알아두면 좋은 것들에 대해서 정리하여 작성해 보도록 하겠다. 하지만,Cursor 공식 홈페이지에 게시된 업데이트 내역을 보는 것이 가장 좋기 때문에 제대로 모든 내용을 확인하.. 이전 1 2 3 4 ··· 22 다음