Android/Compose24 [Android] Compose의 staticCompositionLocalOf와 compositionLocalOf의 차이 전에 포스팅에서 CompositionLocal을 간단히 다룬 적이 있지만, 이번에는 staticCompositionLocalOf와 compositionLocalOf의 차이를 중심으로 다시 정리해보려고 합니다. 상태 호이스팅(State Hoisting)과 전달의 문제컴포저블 함수는 트리(tree) 구조로 이루어져 있습니다. 그리고 상태는 일반적으로 트리의 가능한 한 상위 노드에서 선언한 뒤 하위 노드로 전달하는 것이 권장됩니다(= 상태 호이스팅). 따라서, 트리의 깊이가 깊어질수록(예: depth = n) 같은 상태를 최하위까지 전달하려면 n개의 함수 매개변수를 추가해야 하는 문제가 있습니다.예를 들어 트리 깊이가 100이라면, 단순히 상태 하나를 전달하기 위해 함수 100개에 전부 매개변수를 추가해야 .. 2025. 8. 30. [Android] Compose에서 자연스러운 텍스트 표시하기(Font Padding, Baseline, LineHeight) Jetpack Compose로 UI를 만들다 보면 Text 컴포넌트의 위치가 미묘하게 어긋나거나, 상하 여백이 어색하게 느껴지는 경우가 있습니다.이런 문제는 대부분 Font Padding, Baseline 정렬, LineHeight 같은 텍스트 관련 속성을 상황에 맞게 설정하지 않아서 발생합니다. 이번 포스팅에서는 각 속성이 어떤 역할을 하는지, 그리고 어떤 상황에서 어떤 속성을 조절해야 자연스러운 텍스트 UI를 만들 수 있는지 알아보겠습니다. 1. Font PaddingJetpack Compose에서 Text 컴포넌트를 사용할 때, 의도하지 않은 위아래 여백이 생긴다고 느껴본 적 있으신가요? 그 이유는 Font Padding 때문입니다. Text는 기본적으로 폰트 자체에 정의된 패딩을 포함하는데, 이 .. 2025. 7. 30. [Android] Compose의 IntrinsicSize.Min와 wrapContentHeight() 차이 회사 프로젝트에서 갤럭시 폴드 대응 중, IntrinsicSize.Min을 사용해 자식 컴포넌트의 높이에 따라 부모 높이를 조정하는 레이아웃 코드에서 내용이 아래쪽에서 잘리는 현상이 발생했습니다.문제 원인 분석 결과, 동적 콘텐츠를 사용하는 경우 IntrinsicSize.Min은 초기 컴포지션 시점에만 크기를 계산하기 때문에, 이후 네트워크 등을 통해 받아오는 실제 콘텐츠 높이를 반영하지 못해 잘림이 발생한 것이였습니다.즉, viewModel에서 Flow로 네트워크 데이터를 수신하고, 컴포저블에서 collectAsState() 등으로 이를 받아 UI를 구성할 때, 초기 컴포지션에서 높이가 먼저 계산되어 이후 콘텐츠 반영이 누락되는 상황이 생긴 것입니다. 이번 글에서는 IntrinsicSize.Min 사용.. 2025. 7. 12. [Android] Compose의 ConstraintLayout ConstraintLayout in ComposeConstraintLayout은 컴포저블(Composable)들을 서로 상대적인 위치에 배치할 수 있게 해주는 레이아웃입니다. 여러 개의 중첩된 Row, Column, Box 또는 커스텀 레이아웃을 사용하는 대신으로 활용할 수 있습니다. 복잡한 정렬이 필요한 큰 레이아웃을 구현할 때 유용합니다. 다음과 같은 상황에서 ConstraintLayout 사용을 고려해보세요:화면에 요소를 배치하기 위해 여러 개의 Column과 Row를 중첩 사용하는 것을 피하고, 코드의 가독성을 높이고자 할 때컴포저블을 다른 컴포저블 기준으로 배치하거나, 가이드라인(guideline), 배리어(barrier), 체인(chain) 등을 기준으로 배치하고자 할 때뷰 시스템(View s.. 2025. 6. 5. [Android] Compose 레이아웃에서 Intrinsic 측정 Compose 레이아웃에서 Intrinsic 측정Compose에서는 자식 컴포저블을 한 번만 측정해야 한다는 규칙이 있습니다. 자식을 두 번 측정하려고 하면 런타임 예외가 발생합니다.하지만 경우에 따라 자식을 실제로 측정하기 전에 그 크기 정보를 알고 싶을 때가 있습니다.이럴 때 사용하는 것이 Intrinsics입니다.Intrinsics를 사용하면 자식을 아직 측정하지 않은 상태에서 필요한 크기 정보를 미리 쿼리할 수 있습니다. 예를 들어, 특정 컴포저블에 대해 다음과 같은 정보를 요청할 수 있습니다:Modifier.width(IntrinsicSize.Min)→ 콘텐츠를 제대로 표시하기 위해 필요한 최소 너비는 얼마인가?Modifier.width(IntrinsicSize.Max)→ 콘텐츠를 제대로 표시할.. 2025. 6. 2. [Android] Compose의 정렬선(Alignment lines) Jetpack Compose의 정렬선(Alignment lines)Compose의 레이아웃 모델은 AlignmentLine을 사용하여 사용자 정의 정렬선을 만들 수 있도록 지원합니다. 이러한 정렬선은 부모 레이아웃이 자식들을 정렬하거나 배치할 때 사용할 수 있습니다. 예를 들어, Row는 자식들이 제공하는 커스텀 정렬선을 이용해 자식들을 정렬할 수 있습니다. 특정 AlignmentLine에 대한 값을 레이아웃이 제공하면, 부모는 측정 후 해당 자식의 Placeable 인스턴스를 통해 정렬선 위치 값을 읽을 수 있습니다 (Placeable.get 연산자 사용). 부모는 이렇게 얻은 정렬선의 위치를 기반으로 자식의 배치 위치를 결정할 수 있습니다.일부 Compose 컴포저블은 이미 기본적으로 정렬선을 제공합.. 2025. 6. 2. 이전 1 2 3 4 다음