[안드로이드 / Kotlin] 소스코드 수정 없이 debug/release 앱 분리하기
·
Android
안녕하세요! 안드로이드 개발을 하다보면 앱 배포 이전에 테스트를 하기 위해 debug용으로 앱을 따로 추출하여 사용하는 경우가 많습니다. 저 같은 경우 debug용 빌드를 위해 패키지명이라던가 앱이름을 하나하나 수정한 뒤에 따로 apk를 추출했었습니다. 하지만 이는 추후 실제 release 앱을 배포할 때 소스코드를 원래대로 돌려놓아야하기 때문에 여간 귀찮은 일이 아닙니다..😢 그래서 오늘은 소스코드 수정없이 debug와 release용 앱을 분리하는 방법에 대해 알아보도록 하겠습니다. 패키지명 분리 Gradle에서 debug와 release용에 맞는 앱 이름을 각각 따로 설정하실 수 있으며, applicationIdSuffix를 이용하면 패키지명을 직접 바꿀 필요없이 debug용으로 빌드할때 자동으로 ..
[안드로이드 / Kotlin] Status bar 투명하게 (with DrawerLayout)
·
Android
안녕하세요! 오늘은 제가 개발하면서 오랫동안 삽집했던 DrawLayout을 이용한 Navigation을 구성 시 Status bar 를 투명하게 하는 방법에 대해 알려드리고자 합니다. 문제 상황 : DrawerLayout 과 Navigation 사용시 Status bar 영역까지 꽉차지 않는 상황 해결방안 1. DrawerLayout 및 NavigationView에 fitsSystemWindows="true" 속성 추가하기 ... fitsSystemWindows="true" : 상태 표시줄과 같은 시스템 창을 기반으로 보기 레이아웃을 조정하는 속성. true 이면 시스템 창을 위한 공간을 남기기 위해 패딩을 조정합니다. 즉 Status bar나 Navigation bar를 포함한 전체 창 크기에 맞게 레..
[안드로이드 / Kotlin] Dagger Hilt
·
Android
안녕하세요! 오늘은 안드로이드 개발에 자주 사용되고 있는 의존성 라이브러리 Dagger Hilt에 대해 알아보도록 하겠습니다. Hilt에 대해 소개하기 앞서 먼저 의존성이 무엇인지 이해하는 것이 중요합니다. 의존성이란? A클래스가 자체적인 B클래스를 구성하는 것을 의미합니다. 단지 이 문장만으로는 이해하기 어려우니 간단한 예제를 통해 알아보도록 하겠습니다😊 의존성 주입(DI) 이란?🤔 class Car { private val engine = Engine() fun start() { engine.start() } } fun main(args: Array) { val car = Car() car.start() } 위 코드를 살펴보면 Car 클래스는 내부에서 Engine 이라는 클래스를 만들어 사용하고 있습..
[안드로이드 / Kotlin] Room
·
Android
안녕하세요! 오늘은 안드로이드 앱 개발에 있어서 자주 사용되는 내부 저장소(DB) Room에 대해 알아보도록 하겠습니다. 이전까지는 효과적인 데이터 관리를 위해 파일 형식으로 데이터를 저장하는 관계형 DB인 SQLite를 주로 사용했었는데, 안드로이드 공식 문서에 따르면 아래와 같은 이유로 Room의 사용을 권장하고 있습니다. SQL 쿼리의 컴파일 시간 확인 반복적이고 오류가 발생하기 쉬운 상용구 코드를 최소화하는 편의 주석 간소화된 데이터베이스 이전 경로 Room이란?🤔 Room이란 AAC(Android Architecture Componets)로서 스마트폰 내장 DB에 데이터를 저장하기 위해 사용하는 라이브러리입니다. Room은 ORM(Object Relational Mapping) 라이브러리로 DB..
[안드로이드 / Kotlin] ViewModel(뷰모델)
·
Android
안녕하세요! 오늘은 최근 안드로이드 개발 패턴 중에 자주 쓰이고 있는 MVVM 패턴에서 VM을 담당하는 ViewModel(뷰모델)에 대해 간단히 알아보도록 하겠습니다. 뷰모델의 탄생 배경🤔 안드로이드 공식 개발문서에서는 ViewModel에 탄생 배경에 대해 아래와 같이 설명하고 있습니다. Android 프레임워크는 활동과 프래그먼트 같은 UI 컨트롤러의 수명 주기를 관리합니다. 프레임워크는 특정 사용자 작업이나 완전히 통제할 수 없는 기기 이벤트에 대한 응답으로 UI 컨트롤러를 제거하거나 다시 만들도록 결정할 수 있습니다. 시스템에서 UI 컨트롤러를 제거하거나 다시 만드는 경우, 컨트롤러에 저장된 모든 일시적인 UI 관련 데이터가 삭제됩니다. 예를 들면 앱 활동 중 하나에 사용자 목록이 포함되어 있는데,..
[안드로이드 / Kotlin] 키해시(Key Hash) 얻기
·
Android
안드로이드 개발에 있어 카카오 API, 구글 API, 페이스북 API등등 여러 방면에 있어서 키해시(Key Hash)를 요구하는 경우가 많습니다. 키해시는 OpenSSL과 터미널을 이용해 얻을 수도 있지만, 오늘은 소스코드 상에서 얻는 방법에 대해 소개하고자 합니다. // 키해시 출력 @RequiresApi(Build.VERSION_CODES.P) fun printKeyHash(context: Context) { try { val packageInfo = context.packageManager.getPackageInfo( context.packageName, PackageManager.GET_SIGNING_CERTIFICATES ) val signingInfo = packageInfo.signingIn..
[안드로이드 / Kotlin] 코루틴(Coroutine)
·
Android
요즘 안드로이드에서 네트워크 통신은 필수사항이 되었습니다. 네트워크 통신이 많아짐에 따라서 비동기 처리에 대한 관심이 자연스레 높아지고 있습니다. 비동기 처리 구현방법 중에 많이들 사용하시는 방법에는 Rx가 있는데, Rx의 경우 학습에 오랜 시간이 걸려 진입 장벽이 매우 높은 것으로 알려져있습니다. Rx외 또다른 비동기 처리 구현방법으로 코루틴(Coroutine)이 있는데, 오늘은 코루틴에 대해 간단하게 알아보도록 하겠습니다. 코루틴(Coroutine)이란? 코루틴(Coroutine)은 안드로이드에서 제공하는 백그라운드 스레드 처리방법 중 하나입니다. 기존 안드로이드에서는 AsyncTask라는 비교적 간편한 방법을 이용했었는데, 이는 성능도 낮고 현재 Deprecated 되어 점점 사용하지 않는 것이 추..
[안드로이드 / Kotlin] 타이머(Timer) 구현하기
·
Android
안녕하세요! 오늘은 코틀린에서 제공하는 'kotlin.concurrent.timer'를 이용한 타이머를 구현하는 방법에 대해 간단하게 알아보도록 하겠습니다. Timer 기본개념 Timer는 메인스레드가 아닌 백그라운드 스레드에서 동작가능합니다. 따라서 메인스레드에서만 가능한 UI작업이 불가능지만 이부분은 Handler 및 runOnUiThread()를 이용하면 충분히 구현이 가능합니다. 오늘은 이 두가지외 코루틴을 이용해서 구현하는 방법을 알아보도록 하겠습니다. 사용방법 private var time: Timer? = null fun startTimer(milisec: Int) { var time = milisec timer?.cancel() timer = kotlin.concurrent.timer(pe..
[안드로이드 / Kotlin] BottomSheetDialogFragment
·
Android
안녕하세요! 최근 안드로이드 앱들을 살펴보면 기존 우리가 알고있던 다이얼로그와는 조금은 다르게 아래에서 위로 올라오는 구조로 되어있는 다이얼로그를 종종 볼 수 있습니다. 그래서 오늘은 그런 다이얼로그를 BottomSheetDialogFragment를 이용하여 간단히 구현하는 방법을 소개하고자 합니다. Gradle 추가하기 implementation 'com.google.android.material:material:1.5.0' 코드예시 android:windowIsFloating true : 자식 뷰만큼의 뷰사이즈를 가집니다. false : 다이얼로그가 전체화면을 가집니다. android:navigationBarColor 하단 네비게이션 색을 정합니다. 저같은 경우 다이얼로그가 흰색 바탕인 반면, 하단의..
[안드로이드 / Kotlin] RecyclerView Drag&Drop / Swipe 구현
·
Android
오늘은 안드로이드에서 RecyclerVIew를 사용할때 외부 라이브러리 없이 Drag&Drop으로 아이템의 위치를 변경하거나, Swipe로 아이템을 삭제하는 방법에 대해 알아보도록 하겠습니다. 먼저 해당 기능을 사용하기 위해 ItemTouchHelper.Callback을 상속받은 콜백 클래스 ItemTouchHelperCallback 정의합니다. 이벤트가 발생하여 콜백이 오면 필요한 정보를 전달할 인터페이스 OnItemMoveListener를 정의합니다. 해당 리스너를 편의를 위해 ItemTouchHelperCallback의 파라미터로 놓고, 아이템 움직임에 따른 onItemMoved()와 스와이프에 따른 onItemSwipe() 메소드를 각각 구현해서 사용하시면 됩니다. /** * RecyclerVie..