본문 바로가기

[안드로이드] activityViewModels를 활용해 Activity와 Fragment끼리 ViewModel 공유하기 구글 Material Design Component를 다루는 토이 프로젝트에서 BottomNavigationView를 다루는 Activity가 있었는데, 여기에서 각 탭을 선택할 때 보여지는 Fragment 내에 존재하는 버튼을 눌렀을 때, Activity의 뷰에 들어가 있는 BottomNavigationView의 뱃지를 업데이트 하고 싶었다. 이를 구현하기 위해서는 기존에 by viewModels 코틀린 Delegation을 활용해 주입했던 ViewModel을 Activity에 우선 주입하고, 이를 Fragment에서 activityViewModels Delegation으로 주입해주어야 했다. 이 코틀린 Delegation을 활용하기 위해서는 아래의 라이브러리가 그래들에 선언되어야 한다. // 20년 ..
[안드로이드] Material Design의 Chips를 사용해보자 Google은 Material Design과 함께 별도로 안드로이드에서 바로 사용 가능한 Component들을 제공하고 있다. 이 중 필터링 설정이나 작은 텍스트를 보여주는데 유용한 Chips를 사용해봤다. Material Design에서는 다음과 같은 네 종류의 Chip들을 정의하고 있다. Entry Chip Filter Chip Choice Chip Action Chip Entry Chip은 복잡한 정보를 간략하게 보여 줄 때 사용하도록 권장하고 있고, chip 아이콘과 닫기 아이콘을 별도로 설정이 가능하다. 추가적으로 체크 상태(선택된 상태)를 지정이 가능하다. Fliter Chip은 검색 결과나 내용등에 필터를 걸 때 사용하도록 권장하는 chip이다. 추가적으로 체크 상태(선택된 상태)를 지정이 ..
[안드로이드 | 코틀린 ] 뷰가 겹치는 상황에서 터치 우선순위 관리하기 보통 이런저런 상호작용이 들어가는 UI/UX 를 개발하다 보면 겹치는 뷰로 인해 골머리가 썩게 되기 마련이다. 이번 경우에는 BottomSheetBehavor가 적용된 Layout과 부모뷰인 SwipeRefreshLayout간의 간섭으로 인해 생기는 이슈였는데, 펼쳐진 자식뷰가 Swipe 가능한 부모뷰를 전부 덮게 되면서, 스와이프로 내릴 수 있는 자식 뷰를 내리지 못하고 부모뷰를 통째로 스와이프 해버리게 되어 결론적으로 펼쳐지고 나서는 접을 수가 없는 상황이 생겨버렸다. 터치 이벤트의 우선순위를 조정이 가능하단 것은 인지하고 있었는데, 이를 어떻게 지정해주어야 하는가? 검색끝에 깔끔한 해결책을 찾을 수 있었다. 우선순위를 두고자 하는 뷰에 onTouchListener를 넣어 특정 조건에서 부모 뷰에 r..
[안드로이드] Elevation 효과가 적용된 CardView ViewPager 구현하기 이번에 매터리얼 카드뷰 형태의 ViewPager를 구현해야 하는 요구사항이 생기면서, 일전에 한번 스쳐본 적이 있던 레퍼지토리에 다시 방문했다. rubensousa/ViewPagerCards ViewPager cards inspired by Duolingo. Contribute to rubensousa/ViewPagerCards development by creating an account on GitHub. github.com 해당 레퍼지토리에서는 일반적인 CardView 형태의 ViewPager 구현은 물론 Elevation 효과까지 적용 가능한 코드들을 제공하고 있다. JAVA 기반 소스이기에 이를 프로젝트에 적용하면서 코틀린 및 binding된 요소들과 섞는 작업을 했다. 작업을 진행하면서 필요한..
[Android Studio] No cached version of com.android.tools.build:aapt2:3.6.1-6040484 available for offline mode 에러 대처하기 Unit testing 참고를 위해 Google blueprint 레퍼지토리를 클론해 싱크를 하고 있었는데 No cached version of com.android.tools.build:aapt2:3.6.1-6040484 available for offline mode ... 등의 오류와 함께 그래들 빌드에 실패하는 것이었다. gradle offline mode를 끄라는 글도 있었지만, 해당 옵션이 deprecate 된건지 gradle 옵션에서 찾을 수가 없었고, 다음으로 찾은 해결책은 프로젝트의 Project Structure를 조정하는 것이었다. 안드로이드 스튜디오의 해당 메뉴로 들어가 Project의 Gradle Plugin Version과 Gradle Version을 전부 최신으로 맞춰주었고, ..
[Jacoco] Jacoco와 gradle로 프로젝트 코드 커버리지 확인하기(Gradle 3.6 버전 이상의 경우) Unit test를 도입하게 되면서 같이 도출하고 싶어 했던 지표는 물론 프로젝트의 코드 커버리지였다. 전반적인 프로젝트가 얼마나 테스트 되었는지, 어디가 테스트가 부족한지를 쉽게 알 수 있는 코드 커버리지 도출은 필요한 것이고 직접 눈으로 보고 싶은 것이기도 했다. (배그 한판이 끝날 때마다 OPGG를 리프레시하는 심정이랄까) 0. 실행환경 - 최근 Android studio와 함께 업데이트 된 최신 Gradle Version 3.6.1 이 사용되었다. - 프로젝트의 언어는 Kotlin으로 짜여져있다. 1. 설정하기 app level의 gradle 코드에 아래 코드들을 추가한다. - 기본설정 // jacoco와 application plugin 추가 apply plugin: 'com.android.ap..
[Testing] 테스트 피라미드를 통해 테스팅의 세가지 범주 살펴보기 금번에 신규 업데이트를 준비하면서 이전부터 해보고 싶던 유닛 테스트를 도입해보고자 했고, 팀원들에게 적극 추천해보기로 했다. 우선 추천을 하기 전에 테스팅이 무엇인가, 왜 테스팅을 해야하는가에서 출발하기 위해 자료를 열심히 찾았고 찾아낸 테스트 피라미드를 기점으로 출발점을 가져가기로 했다. 안드로이드 공식 문서에서도 테스팅에 관해 다양한 항목을 통해 심층적으로 다루고 있으니, 이미 테스트 피라미드를 보신 분들은 구글 문서를 통해 더 깊게 배워보는 것이 좋겠다. https://developer.android.com/training/testing/?hl=ko Android에서 앱 테스트 | Android 개발자 | Android Developers Android에서 앱 테스트 Android Jetpack의 ..
[안드로이드] ViewPager의 페이지 별 요소를 참조할 때의 유의점 ViewPager에 개별 페이지를 구현하고자 할 때에는 기존 방식에서 이슈가 없었는데, 개별 페이지 내에서 조작해야 하는 요소가 들어가고 나니 문제가 생겼다. 페이지를 이동하면서 페이지들의 생명주기가 변하는 것, 그리고 참조값이 달라지기 때문인지 넣어준 버튼들과 터치 이벤트가 제대로 동작하지 않았다. 이를 해결해주기 위해서는 Adapter 내에서 instantiateItem을 override 해주어야 했다. override한 instantiateItem 내부에 참조하는 요소들을 지역변수로 할당해주니 페이지 별로 참조하고자 했던 요소들이 정상적으로 동작하는 걸 확인할 수 있었다. override fun instantiateItem(container: ViewGroup, position: Int): Any ..