Android

하단 탭 바를 통해 탭을 이동하는 것뿐 아니라 간혹 내부 컴포넌트 onClick을 통해 탭을 이동해야 하는 경우가 있습니다.이때는 NavController를 통해 원하는 탭을 지정할 수 있습니다.FloatingActionButton( onClick = { navController.navigate(Screen.Notes.route) } ...navigate 함수에 탭 key 값을 인자로 넣어줌으로써 지정한 탭으로 이동이 가능합니다. 하지만? 여기서 문제가 한 가지 발생합니다.1번 탭에 있다가 2번 탭으로 navigate -> 이후 다시 하단 탭바로 1번 탭으로 이동하려 하면 1번 탭으로 이동되지 않습니다.이 현상은 NavController가 경로(Route)와 백 스택(Back..
컴포즈에서 하단에 4칸짜리 탭을 구현해 보겠습니다.먼저 gradle에 아래 navigation 의존성 추가가 필요합니다.implementation("androidx.navigation:navigation-compose:2.8.1")implementation("androidx.compose.material3:material3:1.2.1") 탭을 구성하기 위해서는 NavigationBar, NavigationGraph, 각 탭 별 Screen Class가 필요합니다.그리고 화면에서 NavController를 통해 등록된 화면 간의 이동을 제어하게 됩니다. 먼저 필요한 화면에 대한 기본 데이터(route, title, icon....)들을 sealed class로 정의해 줍니다.sealed class Scre..
자사 서비스를 개발하던 중, 대량 데이터를 가지고 있는 특정 사용자의 CS에서 화면에 보여야 할 데이터의 렌더링이 느리다는 보고를 받았습니다.화면을 넘기다가 멈추면 일정이 늦게 그려져요. 서비스의 데이터(일정)를 보여주는 화면의 구조는 ViewPager로 구성되어 있었고, 각 페이지가 Selected 될 때마다 매번 전체 데이터 중 현재 화면에 보여줘야 할 데이터들을 쿼리 하는 작업이 수행되는 구조였습니다.문제점은 빠르게 스크롤을 하면 대량의 쿼리 요청이 축적되고, 데이터 DB는 작업의 부하가 걸리면서 최종적으로 보이는 마지막 페이지의  쿼리 후 데이터 렌더링이 지연되는 것이었습니다. 해결 방안DB 작업을 취소하던지, 순서 제어를 하던지 둘 중 하나의 방법이 필요했습니다.하지만 안드로이드 SQLite에서..
리스트를 구성하다 보면 각종 기능을 위해 상단 또는 하단에 여백을 주고 싶은 경우가 있습니다.이럴 때, 처음 또는 마지막 뷰 홀더에 margin을 넣는 것이 아니라 RecyclerView 자체에 padding Top 또는 Bottom을 넣어주면 됩니다.하지만 바로 넣은 이후에는 그만큼 margin 값이 스크롤 영역을 잡아먹게 되는데요.이런 경우를 고려히여 clipToPadding을 false로 지정해 주면 됩니다.RecyclerView의 clipToPadding 속성은 RecyclerView가 자신의 패딩(padding) 영역에 있는 항목을 표시할지 여부를 결정하는 속성입니다.기본 값: truetrue로 설정되어 있을 경우, RecyclerView는 패딩 영역에 있는 항목을 잘라내고 표시하지 않습니다. ..
skydoves 님께서 제공해 주신 안드로이드 개발자 로드맵을 참고하여 작성하는 게시물입니다.https://github.com/skydoves/android-developer-roadmap/blob/main/README_KR.md android-developer-roadmap/README_KR.md at main · skydoves/android-developer-roadmap🗺 The Android Developer Roadmap offers comprehensive learning paths to help you understand Android ecosystems. - skydoves/android-developer-roadmapgithub.com안드로이드 패키지에는 APK(Android Pack..
Fatal Exception: android.database.CursorWindowAllocationException: Could not allocate CursorWindow '/data/user/0/~. db' of size 4194304 due to error -12.직접 재현되는 것은 아니지만 갑자기 특정 사용자의 Crashlytics로부터 위와 같은 내용의 에러 리포트를 받았습니다.내용을 보니 Cursor 활용 부분에서 메모리 초과로 인한 Crash가 발생한 것으로 파악됩니다.문제가 발생 코드는 특정 조건에 해당하는 데이터의 COUNT를 쿼리하는 내용이었습니다.  데이터나 메모리 사용량 등.. 근본적인 원인들이 있겠으나 일단 대응 코드로 어차피 1개 이상의 존재 유무만 파악하면 되는 것이므로 c..
안드로이드 컴포즈에서 Text의 Font 사이즈를 지정하는 방법입니다.보통 Text Size는 시스템 폰트 사이즈를 따라가는 SP 단위를 사용하지만 혹시 자신의 서비스가 인앱에서 텍스트 사이즈 메뉴를 제공한다면 DP를 사용하는 것처럼 고정해 줄 필요가 있습니다.먼저 해상도별 적절한 크기를 가질 수 있도록 아래 함수를 활용해줍니다.@Composablefun dpToSp(dp: Dp) = with(LocalDensity.current) { dp.toSp() }@Composable: 이 함수는 Compose 환경에서 호출될 수 있는 함수임을 나타내는 어노테이션입니다.dp: Dp: 함수의 인자로 Dp 값을 받습니다. Dp는 화면 밀도에 독립적인 픽셀 단위로, 화면 크기나 해상도에 따라 크기가 변하지 않는 단위입..
TopAppBar는 Android UI에서 상단에 위치하는 앱 바(app bar)를 구현하는 컴포넌트입니다. 이 컴포넌트는 애플리케이션의 타이틀, 내비게이션 아이콘, 작업 메뉴 등을 표시하는 데 사용됩니다. 기본적으로 Top App Bar로 title과 navigation Icon을 구성하면 다음과 같이 나타납니다.타이틀이 왼쪽에 위치해 있는 것을 확인하실 수 있습니다.하지만 디자인 기획에 따라 오른쪽 또는 중앙에 배치할 수 있겠죠. 단순하게 처리한다면, 최대 너비에 맞춘 Row 컴포저블과 그 내부에 Title을 구성함으로써 위치를 조정할 수 있습니다.Row( modifier = Modifier.fillMaxWidth(), // `Row`를 화면 너비에 맞춤 horizontalArrangeme..
이미지 로딩 라이브러리에는 다양한 종류가 있습니다. Picasso, Glide, Coil.. 대표적으로 이 3가지가 많이 사용됩니다.Coil 특징 몇 가지를 정리해 보자면1. 주로 사용되는 3가지 라이브러리 중 이미지 로딩 속도가 가장 빠릅니다.2. Coroutine 기반으로 비동기 이미지 로딩을 처리합니다. 메모리 성능이 향상되고 누수 확률도 줄어듭니다.3. Glide보다 속도가 빠르면서도 Glide를 많이 참조했기 때문에 캐싱, 오류 처리, 이미지 변환 등의 기능 제공에도 문제가 없습니다. 오늘은 간단하게 라이브러리 추가 및 컴포즈에서 이미지를 로딩하는 방법까지 확인해 보겠습니다.먼저 Gradle에 의존성 추가를 진행합니다. implementation "io.coil-kt:coil-compose:2...
API 통신 로직을 구성하다 보면 경우에 따라 다른 형식으로 내려오는 Attributes 필드가 존재하는 경우가 있습니다.유연하게 수신받아 처리하기 위해서 Retrofit에 리플렉션 처리를 추가하는 방법도 있겠지만 단순하게 Any Type Value를 가지는 Map을 데이터 클래스로 반환하는 방법에 대해 알아보겠습니다.data class Result( val isSuccess: Boolean, val data: HashMap)위와 같이 Response 데이터 클래스를 지정했다면 어떤 타입 스타일이 들어올지 모르지만 어차피 수신되는 데이터의 기본 형태는 형태이므로 Map을 지정해 줍니다.그리고 로직에서 필요한 Attributes의 스타일들을 데이터 클래스로 구성합니다.data class Att..
SeungYong.Lee
'Android' 태그의 글 목록 (12 Page)