Android

리스트를 구성하다 보면 각종 기능을 위해 상단 또는 하단에 여백을 주고 싶은 경우가 있습니다.이럴 때, 처음 또는 마지막 뷰 홀더에 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..
안드로이드 컴포즈에서 Tab Bar를 구현하기 위해 고정 TabRow 또는 Scrollable TabRow가 사용됩니다.아주 기본적인 탭을 구성하기에는 빠르게 적용가능한 컴포저블입니다. 하지만, 원하는 스타일에 알맞은 커스터마이징 작업을 진행하기에는 제한적인 부분들이 있습니다.아래 기존의 Scrollable TabRow 코드를 확인해 보겠습니다.(탭의 width를 확장성 있게 가져가기 위해서 Scrollable TabRow를 선호합니다.)@Composablefun ScrollableTabRow( selectedTabIndex: Int, modifier: Modifier = Modifier, containerColor: Color = TabRowDefaults.primaryContainer..
리스트나 화면을 구성하는 동안의 Loading 상태에서 자주 사용되는 Shimmer View. 기존 XML 방식에서는 각종 라이브러리를 활용하여 많이 구현되었습니다.하지만 Compose에서는 아직 직접 구현이 필요한 듯하여 다른 분들의 코드를 참고하여 구현을 진행했습니다.먼저 위 이미지와 동일한 형태의 컴포저블을 구현해야합니다.스켈레톤 효과를 입혀줄 틀을 만들어주는 것입니다. @Composable fun PlaceholderItem() { Row( modifier = Modifier .fillMaxWidth() .padding(16.dp) .height(72.dp) ) ..
이미지 로딩 라이브러리 중 하나인 Colil을 Compose UI에서 로딩 시, 실패했을 경우의 Error를 확인하기 위한 방법입니다. val painter = rememberAsyncImagePainter( model = ImageRequest.Builder(context).data(item.imageUrl) .placeholder(R.drawable.blank_ad).build())인자로 받은 item의 imageUrl을 통해 이미지를 로딩합니다. 물론 manifest에 인터넷 사용 권한이 허가되어 있는지 또한 반드시 체크해 주세요.로딩했는데, placeholder의 Drawable로 표시되면 뭔가 문제가 있는 것이겠지요? val state = painter.statepainter의..
SeungYong.Lee
'Android' 태그의 글 목록