[메모] Android Studio의 Compose Preview에서 이미지 Copy하기
Compose Preview에 노출하는 이미지를 동료 혹은 다른 사람과 공유하고 싶은 경우가 있다.
Android Studio에는 Compose Preview에서 이미지를 클립보드로 복사하는 기능이 있다.
- Compose Preview에서 우측 클릭
Copy Image
선택- 원하는 곳에 붙여넣기
Compose Preview에 노출하는 이미지를 동료 혹은 다른 사람과 공유하고 싶은 경우가 있다.
Android Studio에는 Compose Preview에서 이미지를 클립보드로 복사하는 기능이 있다.
Copy Image
선택Android 개발 시 Compose 사용이 늘어남에 따라 다양한 기능들이 요구되고 있습니다. 대표적인 것 중 하나가 Navigation입니다. 구글도 Compose navigation을 제공하고 있지만, 오늘은 Compose Navigation에서 BottomSheet에 관련된 케이스를 다뤄보겠습니다.
Compose Navigation에서 BottomSheet 사용 시 많이 거론되는 것이 Accompanist
라이브러리입니다.
Accompanist : https://google.github.io/accompanist/
Accompanist 라이브러리는 개발자에게 필요하지만, androidX 라이브러리로는 아직 미제공 중인 기능 그룹입니다. Jetpack Compose를 보완하는 것을 목표로 하고 있습니다
원문 : Accompanist is a group of libraries that aim to supplement Jetpack Compose with features that are commonly required by developers but not yet available.
현재는 대부분의 기능은 AndroidX로 이전되거나 일부만 남아있습니다.
https://google.github.io/accompanist/navigation-material/
Accompanist Navigation Material은 Navigation 사용 시 BottomSheet를 연결하는 용도로 사용합니다. 아래 코드로도 알 수 있듯이 기존 XML 기반의 navigation에서 BottomSheet를 연결하는 것과 동일합니다.
NavHost(…) {
bottomSheet(…) {
// Composable content
}
}
Accompanist의 Navigation Material은 AndroidX의 androidx.compose.material.navigation
로 이전되었습니다.
AndroidX androidx.compose.material.navigation 1.7.0-alpha04부터 지원 : https://developer.android.com/jetpack/androidx/releases/compose-material#1.7.0-alpha04
Jetpack Compose Material Navigation로 이전되었지만, 대부분의 API 그대로 승계되었습니다. Accompanist Navigation Material을 사용하고 있다면 Migration을 참고해주세요. 이로써 BottomSheet를 Jetpack Compose Navigation에서도 사용할 수 있습니다.
@Composable
fun BottomSheetNavDemo() {
val bottomSheetNavigator = rememberBottomSheetNavigator()
val navController = rememberNavController(bottomSheetNavigator)
ModalBottomSheetLayout(bottomSheetNavigator) {
NavHost(navController, ...) {
bottomSheet(...) {
...
}
}
}
}
샘플 코드 출처 : https://github.com/androidx/androidx/blob/androidx-main/compose/material/material-navigation/samples/src/main/java/androidx/compose/material/navigation/samples/ComposeMaterialNavigationSamples.kt
이전부터 Accompanist를 사용했다면 이전되었다는 것을 알지만, 아쉽게도 Jetpack으로 이전 후 공식 릴리즈 노트에서는 별다른 언급이 없습니다. 게다가 Compose BOM 사이트에서도 언급은 안되고 있습니다.
BOM to library version mapping : https://developer.android.com/develop/ui/compose/bom/bom-mapping
다행히 실제 Compose BOM을 관리하는 bom.pom파일에는 Compose Material Navigation(=androidx.compose.material.navigation) 내용이 포함되어 있으므로 사용에는 문제없습니다.
Google maven repository : https://maven.google.com/web/m_index.html?q=bom#androidx.compose:compose-bom:2025.03.00
그리고, 버전업에 맞춰서 API 변경도 진행되고 있습니다.
https://github.com/androidx/androidx/tree/androidx-main/compose/material/material-navigation/api
그럼 우리는 compose material navigation을 사용하면 될까요? 기존 Navigation 스펙과 동일하게 사용된다면 문제없습니다. 다만, Material 3를 사용하는 개발자에겐 예외입니다.
현재 compose material navigation의 build.gradle.kts 코드의 종속성을 찾아보면 기본 material를 참조하고 있습니다.
implementation(project(":compose:material:material"))
소스 출처 : https://github.com/androidx/androidx/blob/androidx-main/compose/material/material-navigation/build.gradle#L30
material 3 naviation 라이브러리도 제공하지 않을까? 하는 생각이 자연스럽게 떠오릅니다. 하지만 개발 시작한 지 얼마 안 된 코드들과 마주하게 됩니다. 게다가 2025.03.16 시점에는 릴리즈도 안 된 상태입니다. 이 경우에 해당한다면 다른 대안을 생각해 보셔야 합니다.
개발 중인 navigation3 : https://github.com/androidx/androidx/blob/androidx-main/navigation3/navigation3/androidx-navigation3-documentation.md
Twitter/Reddit에서 deprecated되는 것이 아니냐라는 언급들이 보입니다.
Navigation-Compose is effectively abandoned, and slated to be deprecated when Navigation3 comes out. #androiddev
— Gabor Varadi (@Zhuinden) March 4, 2025
Always great to use those "officially supported libraries" managed by another party & another team, that will surely be supported forever...https://t.co/5f50BqWMIT pic.twitter.com/BuQtWwvJll
migrate fragments transaction to compose navigation
byu/hulkdx inandroiddev
현 단계에서 Jetpack Compose Material Navigation은 어떤 방향으로 흘러갈지는 알 수 없습니다. 구글 또한 몇 가지의 기능들이 우선 개발되고 있을 테고, 아마도 최신 API와 Material 3의 우선순위가 높을 것입니다.
개인적으로는 Material 3가 Material의 지원 속도가 빠르며, 동일한 컴포넌트더라도 더 많은 기능을 제공하고 있으므로 Material 3의 우선순위가 높다고 판단했습니다.
최근 트랜드와 구글의 기술 지원 덕분에 Compose가 기존 XML 대비 장점이 부각되고 있습니다. 다만, 기존 XML은 10년 이상 쌓인 기술/노하우와 라이브러리들이 존재합니다. 그에 비해 Compose는 기술 채용되는 속도에 비례하여 지원 속도가 아쉬운 상태입니다. 장기적으로 나아질 거라는 기대를 해봅니다.
2부 두 번째 글에서는 LazyList에서 호출하는 rememberLazyListMeasurePolicy 함수를 살펴볼 예정입니다.
최신 Android Studio Meerkat RC 1과 Ladybug Feature Drop IDE에서 Build 메뉴
선택에 따라 변경되는 동작을 확인해 보려고 한다.
2부에서는 1부 LazyColumn/LazyRow에서 호출되는 내부 Composable인 LazyList와 관련된 정보를 살펴볼 예정입니다.
앞으로 살펴볼 Composable 함수의 대부분은 internal 혹은 private으로 실제 개발자가 직접 만져볼 코드는 아닙니다.
Android 개발에서 Jetpack Compose 채택이 늘어감에 따라 주요 컴포넌트 중 하나인 LazyColumn/LazyRow에 대해서 알아보겠습니다. 앞으로 나오는 코드는 public 및 내부 코드를 기반으로 파악한 부분입니다.
최근 Library 모듈에서 Instrumentation Test시에 경험한 기록을 남겨봅니다. 해당 작업은 오랜만에 0부터 작업해서 변경된 부분을 놓쳐서 간단하게 남겨둡니다.
Compose를 부분 적용하는 케이스 중 하나는 BottomSheetDialogFragment에서 View만 Compose로 바꾸는 케이스이다.
AndroidX Compose foundation 1.2.0-alpha03부터 Lazy List/Grid에서 key 대신 Content type이 추가되었습니다.
본 글에서는 동일한 Key를 사용시 크래시가 발생하는 내부 코드 통해 이유를 살펴보겠습니다.
Subscribe to this blog via RSS.
Jetpack Compose: LazyColumn/LazyRow 내부 코드 분석 ~ 2부 LazyList (2) rememberLazyListMeasurePolicy
Posted on 09 Feb 2025