본문 바로가기

Android

(16)
[Android/Testing] Hot StateFlow의 유닛 테스팅 in ViewModel 이제 LiveData의 시대가 가고 자연스레 Flow의 시대가 도래한 듯 하다. LiveData와 마찬가지로 동적인 속성을 가진 Flow의 테스팅을 위해서는 일련의 설정이 필요한데, 해당 포스트에서는 다루는 빈도가 많을 Hot StateFlow의 Unit-Test 설정 및 방식을 정리하려 한다. Dependencies org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3 org.jetbrains.kotlinx:kotlinx-coroutinesandroid:1.7.3 kotlin = "1.8.10" Testing 1. Before, After Annotation으로 테스트 전후 Dispatcher를 UnconfinedTestDispatcher로, 테스트 이후 이를 초..
[Android] Android lifecycle과 savedInstanceState 안드로이드의 시작과 끝은 Activity와 Fragment의 lifecycle이다 할 수 있을 정도로 lifecycle에 대한 중요성은 여러번 말해도 모자르지 않다 싶다. 이전부터 개발자들이 가져왔던 고민들은 앱의 화면방향 전환이 일어나는 경우, 언어가 변경되는 경우, 화면 해상도가 변경되는 경우 등 다양한 변수로 인해 기존의 Activity 혹은 Fragment가 destroy된 이후 다시 재생성되는 케이스를 어떻게 대처할 것인지 일 것이다. 이러한 환경에서 주요 변수를 보존하기 위해 안드로이드는 savedInstanceState를 제공한다. 재생성 및 savedInstanceState에 관해 중요한 내용들을 간단히 정리해 보았다! Activity 및 Fragment Activity가 Backgroun..
[Dagger2] 헷갈리는 DI 어노테이션 및 개념 정리 Dagger2를 사용한 DI를 반영하는 중에 헷갈리고 어려움을 겪는 부분을 최소하 하고자 내용을 좀 정리해두기로 했다. 어노테이션들에 대한 이해와 컴포넌트와 모듈간의 의존성 주입이 어떻게 이루어지는지가 이해되어야 원하는대로 의존성 주입을 수행함은 물론 컴파일 에러 지옥에서 빠져나올 수 있을 것이다. 0. 기본개념 Dagger2는 의존성 주입을 위해 개발된 라이브러리이다. 높은 러닝 커브를 자랑하지만, Hilt나 Koin에 앞서 광범위하게 사용되고 있는 DI 라이브러리로 알고 있다. 작동하기 위한 핵심 요소들만 살펴보면 의존성 주입을 위해서는 아래 요소가 구성되어야 한다. 제공하고자 하는 객체와 메소드 > 객체와 메소드의 의존성을 제공하는 모듈 > 모듈이 제공하는 의존성을 프로젝트에 제공하는 컴포넌트 이들..
[안드로이드] ConstraintLayout + CollapsingToolbarLayout 활용해 접히는 TabBar 구현하기 뱅크샐러드 및 야놀자 등 상단 탭영역이 접히는 UI/UX를 프로젝트에 적용하고자 했다. 구현을 위해 고르게 된 layout은 CollapsingToolbarLayout으로, 이름은 Toolbar로 딸려있지만 컴포넌트들을 추가해 툴바 이상의 요소들을 보여줄 수 있는 걸 확인할 수 있었다. 처음에는 레이아웃 코드 적용 후에도 동작이 되지 않거나, 스와이프 중 뷰가 제대로 접히지 않고 따로 논다던지 등의 이슈가 있었는데, 이하 문제들을 해결하면서 적용한 요소들을 정리를 해두고자 한다. 이번 구현에 있어 공식문서 외에 실구현 사례들을 레퍼런스로 삼아 차이점이 존재할 수 있으니, material.io에 나와있는 공식문서를 참조하는 것도 좋을 것 같다. Collapsing Toolbars - Material Com..
[안드로이드] MVVM 아키텍처로 간단한 계산기 만들기 MVVM을 초기단계부터 파서 좀 익숙해지고자 하는 마음에 계산기를 떠올렸고, 이를 MVVM 아키텍처를 이용해 구현하고자 했다. 사실 MVVM의 강점을 살린다기보단 MVVM의 형태와 Databinding을 활용해 로직을 짤 때 어떠한 방식으로 활용이 가능한지 알아볼 수 있는 과제였던듯. 간단한 순서 1. app 레벨 gradle에 Databinding 활성화 - kotlin-kapt plugin설정이 들어가있지 않다면 최상단 부분에 apply plugin: 'kotlin-kapt' 를 추가해주어야 함. android { ... dataBinding { enabled = true } ... } 2. 메인 레이아웃의 databinding 설정 ... 3. ViewModel의 설정 - 양방향 바인딩을 적용할 O..
[안드로이드] CountDownTimer의 시간 Sync 문제 해결하기 프로젝트에서 MediaPlayer와 CountDownTimer를 사용하면서 몇가지의 애로사항이 있었는데, 이를테면 영상을 중지하고 다시 재개할 때의 기존의 타이머를 어떻게 다시 설정하냐는 것이었다. 왜냐하면 CountDownTimer에는 별도의 pause 기능이 없고, stop만이 가능했기 때문이다. 우선 기존의 요구사항은 아래와 같다. MediaPlayer는 10개의 영상을 연달아 재생한다. 각 영상은 각기 다른 재생시간을 가진다. 영상은 10초의 대기시간을 가진 뒤 재생을 시작한다. 사용자는 대기시간 및 재생중에도 상관없이 일시정지 및 다시시작(resume)이 가능하다. 일시정지 및 다시시작, 재생을 진행하는데 모든 타임라인이 일치하여야 한다. (남은 시간, 경과 시간 등) 여기서 포인트는 일시정지 ..
[안드로이드] SDK 버전에 구애받지 않고 별도의 클래스에서 이미지 asset 참조해 적용하기 작업을 하면서 Activity가 아닌 클래스에서 이미지 asset을 참조해 이를 이미지뷰에 적용하고자 하였는데, 리소스 혹은 context로부터 getDrawable을 하면 SDK limit이 걸리는 걸 확인할 수 있었다. (SDK 버전 21 아래에서는 먹히지 않는다는 코드) 대안을 찾고자 검색을 하였고 ContextComnpat을 통해 SDK 버전에 구애받지 않으면서 Activity가 아닌 별도의 클래스에서 이미지 asset을 참조할 수 있었다. ContextCompat.getDrawable(getContext(), R.drawable.참조할Drawable) 이를 이미지뷰에 넣고자 할 땐 myImageView.setImageDrawable(상단의코드) https://stackoverflow..
[안드로이드 | 코틀린] 사용자 정의 커스텀 달력 만들고 ViewPager에 접목하기 커스텀 달력 구현을 위해 자료를 찾던 중 Medium에서 참조할만한 레퍼런스를 찾았으나 자바코드로 구성되어 있는것은 물론 일부 생략된 부분들이 있어 구현에 조금 어려움이 있었다. 우여곡절 끝에 기본구성을 마치고 구성에 필요했던 과정과 준비물들을 정리해두고자 한다. 준비물 1. 뷰로 선언할 캘린더의 xml Layout (calendar_layout) 2. 달력의 일자에 적용할 xml Layout (calendar_day_layout) 3. LinearLayout을 확장해 만든 커스텀 캘린더 클래스 4. 캘린더의 일자 구성, 색상변경등을 수행할 캘린더 어댑터 클래스 구성 방법 1. 뷰로 선언할 캘린더의 xml Layout (calendar_layout) 만들기 캘린더의 전체 틀로써 크게 LinearLayou..