전체 글

Android 및 취미 활동을 공유하는 블로그입니다!!
Android/Common

[Android] Radius 올바르게 적용하기

안녕하세요 점냥입니다 :) 오늘 소개할 Radius는 Android UI를 구현해 보신 경험이 어느 정도 있다면 익숙한 개념이라고 생각합니다. View를 원형 혹은 둥근 모서리를 가진 사각형으로 표현하고 싶을 때 사용하는 속성입니다. 그런데 이 Radius의 원리에 대해 알고 있으신가요? Radius는 뷰 각 모서리에서 굴절률을 표현하는 원의 반지름으로 사용됩니다. 위 사진은 100dp의 크기인 사각형에 radius를 25dp로 적용했을 때 모습인데요. 각 모서리에 주어진 반지름의 원을 그려 외곽 모서리를 각 원에 맞춰져 잘리면서 그려지게 됩니다. SDK 따라서 다르게 표현되는 Radius Android 개발을 하다가 낮은 버전에서 원형의 Shape가 고구마처럼 깨진 경험이 있으신가요? Radius의 원..

Android/Error

[Android] contact picker doesn't work on Android 11

오늘 우연히 옆자리에 같이 있는 iOS 개발자분과 앱 인터렉션에 대해서 이야기를 나누는 도중 연락처를 불러오는 기능이 올바르게 동작하고 있지 않는다는 것을 알게 되었어요. (눈물...) val intent = Intent(Intent.ACTION_PICK).apply { data = ContactsContract.CommonDataKinds.Phone.CONTENT_URI } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } 위 코드는 기기 내에 설치된 연락처 앱을 실행시키는 코드입니다. Android 10 이하에서는 정상 동작하는 것을 확인할 수 있지만 Android 11 버전에서는 아무일도 일어나지 않는 것을 확..

Android/Error

[Android] Snackbar에서 발생하는 ScrollView can host only one direct child

Fatal Exception: java.lang.IllegalStateException ScrollView can host only one direct child Snackbar란 안드로이드에서 사용자에게 메시지를 보여주는 기능이에요. Toast라는 비슷한 기능도 있긴 한데 ㅎ 제가 다니고 있는 회사에서는 Snackbar를 자주 사용하고 있어요. 그런데 위에 적힌 Exception이 가끔 제보가 들어왔었는데요. 지금까지 정확한 오류 원인을 파악하지 못하고 있었지만... 오늘 그 실마리를 잡은 것 같아서 여러분에게 공유해드리려고 합니다. 개요 ... Snackbar.make(viewBinding.rootLayout, "SanckBar Test", 10000).show() 오류가 발생한 화면의 레이아웃과 S..

Android/Compose

[Android] Space Hoisting, Compose에서 여백을 주는 방법

앱 UI를 구성하는 TextView, Button 등 컴포넌트 사이사이에는 의도적으로 여백을 넣어요. 붙어 있으면 답답한 느낌을 주고 유저에게 강조하고 싶은 UI가 한눈에 들어오지 않기 때문이겠죠? (개발자의 추측 ㅎ) XML 기반의 Android UI에서는 margin 혹은 padding으로 여백을 구현했었습니다. 그렇다면 새로운 UI Kit인 Compose에서는 어떻게 구현할까요? 바로 Modifier.padding이랑 Space Composable을 사용하면 됩니다 :) Padding, Spacer @Composable fun MyComponent( displayText: String ) { Text( text = displayText, modifier = Modifier.padding(bottom..

GIT

[Git] 원격 저장소에서 지워진 브랜치, 로컬 브랜치에서도 지우기

Git-Flow 브랜치 전략에 따르면 보통 한 기능에 대해서 최소 하나의 브랜치를 생성하여 작업을 진행할 거예요. 그런데 작업이 진행될수록 점점 늘어나는 브랜치들 여러분들은 어떻게 정리하고 있으신가요? 원격 저장소에 올라간 브랜치들은 브랜치들은 PR이 머지되는 시점에 정리하면 되지만 로컬 브랜치는 협업을 같이하는 팀원들 모두 해당 브랜치가 존재할 수 있기 때문에 모두가 수동으로 지워줘야 하는 번거로움이 있어요. 삭제된 원격 브랜치 추적하기 $ git for-each-ref --format '%(refname) %(upstream:track)' refs/heads/feature/133/ga refs/heads/feature/minji/182-notify-message [gone] refs/remotes/o..

Android/Compose

[Android] Compose BackdropScaffold 적용해보기

안녕하세요 점냥입니다 :) 위 사진은 오래전에 사이드 프로젝트로 진행한 모꼬라는 프로젝트 홈 화면입니다. Compose 처음 접할 당시 마구잡이로 개발했던 프로젝트라서 마음 한편에 아쉬움을 많이 가지고 있었던 프로젝트였죠. 홈 화면은 모꼬 브랜드를 그래픽 아트의 느낌으로 표현했던 Title 영역과 주요 기능인 실시간 검색어 리스트를 보여주는 Content 영역이 존재했어요. 초기 기획과 디자이너는 리스트를 스크롤함에 따라 상단 Title 영역도 같이 접히는 UX를 기대했지만 당시 관련 자료를 찾을 수 없어서 아쉽게도 리스트만 스크롤되는 채로 배포가 되었죠.. 그러다가 최근에 Material에서 제공해 주는 Compose Layout 중에 BackdropScaffold를 알게 되어서 적용해보려고 해요 Ba..

Android/Common

[Android] Fragment에서 데이터 외부로 전달시키는 방법 - ActivityViewModel

안녕하세요 점냥입니다 :) 지난 포스팅에 이어서 이번에는 ViewModel을 사용해서 Fragment 내에서 데이터를 공유하는 방법에 대해서 알아보겠습니다. 이번 내용은 코드로서 보다는 개념 위주로 설명이 될 것 같아요! 우선 ViewModel이란 Android Jetpack 라이브러리 중 하나로 비즈니스 로직과 데이터들을 저장해 두는 Holder class인데요. MVVM이 대중화가 되고 Activity보다 수명이 긴 장점으로 데이터의 복원/ 저장이 보다 간편해 많이 사용하고 있는 Class입니다. ViewModel의 자세한 내용은 이곳에서 확인해주세요 ActivityViewModel로 Fragment 끼리 데이터 공유 @AndroidEntryPoint class SignUpCodeFragment : ..

Android/Common

[Android] Fragment에서 데이터 외부로 전달시키는 방법 - Callback

안녕하세요 점냥입니다 :) Fragment에서 클릭 이벤트 또는 특정 데이터를 외부로 전달하고자 하는 경우가 많아요. 이를 구현하기 위해 여러 가지 방법이 존재하는데요. 이번 포스팅에서는 Callback을 이용하여 데이터를 전달하는 방법을 소개해보려고 합니다. 잘못된 부분이나 더 좋은 방안이 있다면 댓글로 남겨주세요! Callback을 이용한 데이터 전달 Callback 패턴이 가장 쉽게 구현할 수 있는 방법인데요. Callback이란 다른 함수의 인자로써 넘겨진 후 특정 이벤트에 의해 호출되는 함수를 의미합니다. Android에서는 Listener라고도 부르며 주로 Interface를 구현한 객체를 넘기거나 최근에는 Lambda를 이용하는 모습이 자주 보여요. setter 함수로 콜백 전달하기 clas..

Android/Common

[Android] Very Long Vector Path 해결

안녕하세요 점냥입니다 :) 최근 Vector 이미지 파일에서 Lint 경고를 내보내는 케이스를 발견하게 되었어요. Deprecated 등 코드 레벨에서 발생하는 Lint의 경우보다 쉽게 Lint를 제거할 수 있었는데요. Vector는 path를 어떻게 수정해야 할지 감이 안 오더라고요. path를 마음대로 수정했다가는 원본 이미지와 전혀 다른 결과가 나올 수가 있으니까요. 그래서 한번 찾아보았습니다 :0 Vector Vector는 점과 선, 그리고 색상 정보 등을 포함한 집합을 의미해요. 점과 선에 대한 정보로 그린 이미지는 화면 해상도와 상관없이 동일한 결과를 제공해주기 때문에 Android에서는 21 버전부터 Vector를 사용하면서 이미지를 표현하는 것을 추천하고 있다고 하네요. 반대로 픽셀 방식의..

Android/Common

[Android] 디버그 앱, 출시 앱 분리하기

안녕하세요 점냥입니다 :) 회사 입사 초, 디버그 앱과 프러덕 앱이 분리되어 있지 않아 안드로이드 폰을 사용하고 있으신 직원분들의 불만 사항이 있었어요. 실제로 마켓을 통해 회사 서비스를 이용 중이던 직원분들은 매번 안드로이드 개발팀이 개발한 앱을 테스트하기 위해 출시 버전의 앱을 지우고 디버그 버전을 설치해야 번거로움이 있었어요. 이 문제는 출시 버전의 앱과 디버그 버전의 앱의 패키지가 같아서 독립적으로 앱을 가질 수 없었기 때문이에요. 디버그 앱, 출시 앱 패키지 다르게 하기 디버그 앱과 출시 앱을 동시에 설치할 수 있게 하는 방법은 아주 간단하게 두 버전의 앱의 패키지를 다르게 하면 됩니다. 그리고 Gradle은 이 기능을 buildType을 통해 아주 쉽게 제공해줍니다. 1. buildType으로..

점냥
점냥's Log