목록분류 전체보기 (392)
HTD
배경 앱 메인 화면에 진입을 할 때, 정보를 로드해서 뷰에 나타나기까지의 시간이 조금 있었고, 짧은 시간이긴 하지만 사용자 경험이 별로 안 좋아보였습니다. 이에 따라 저는 Room을 통해 이전의 데이터를 로컬에 캐싱하고, 이 데이터를 이용하여 네트워크 처리가 되기 이전에 캐싱된 데이터를 미리 보여주기로 하였습니다. 개요 Room 관련 세팅 Room Entity, Dao, Repository RoomDatabase, TypeConverters, DI ViewModel에 Offline Cache 적용 구현 1. Room 관련 세팅 build.gradle(root) buildscript { ext { roomVersion = '2.4.3' } } build.gradle(module) apply plugin: ..
서론 결과는 위와 같습니다. 구현 먼저 구현하려는 커스텀 뷰는 다음과 같은 특징이 있습니다. 1. 선택된 아이템의 indicator의 width와 color가 다르다. 2. 위 특성의 변화가 연속적으로 이루어진다. layout_custom_indicator.xml 뷰가 그려질 레이아웃입니다. layout_indicator.xml 각 indicator의 레이아웃입니다. indicator_background.xml 위 layout_indicator에서 참조하는 리소스 파일입니다. 여기서는 shape가 rectangle이지만, 이후에 radius를 줌으로써 둥그런 indicator를 그리게 됩니다. attrs.xml /res/values/attrs.xml 내부에 다음과 같은 코드를 작성하여 커스텀 뷰에 특성을..
문제 상황 해결 과정 1. 의심되는 코드들을 하나씩 주석처리 해가며, 어떤 코드를 지우면 문제가 발생하지 않는지 체크 범위를 좁히다보니, customView(as TextView)에 setTypeface() 함수에서 문제가 발생한다는 것을 발견하였다. 처음에는 indicator 관련 코드를 위주로 브레이크 포인트를 걸거나 주석 처리를 했었는데, 전혀 연관이 없어 보이는, 탭의 TextView와 연관이 있었다. textView.setTypeface( null, if (isSelected) Typeface.BOLD else Typeface.NORMAL ) 2. setTypeface() 함수, Typeface 코드 분석 native code의 벽에 가로막혔으며, 시간을 너무 지체하면 안 되므로 여러 시도를 해..
서론 먼저, 구현하게 될 내용은 다음과 같습니다. 위 영상을 보면, 아이템이 선택되면 파란색 배경이 다이다믹하게 움직입니다. 이번 글은 해당 Indicator를 중심으로 설명할 예정입니다 :) (com.google.android.material.bottomnavigation와 androidx.navigation를 기준으로 구현했습니다.) 구현 IndicatorBottomNavigationView.kt 사실 이 글의 내용의 전부입니다. 개요는 다음과 같습니다. - BottomNavigationView를 상속하는 IndicatorBottomNavigationView 클래스 생성 - startIndicatorAnimation() - indicator: RectF, paint: Paint를 이용한 애니메이션 ..
배경 안드로이드에서 Multiple Image Picker를 구현하려면 직접 구현해야만 합니다. TedPicker 같이 매우 좋은 라이브러리가 이미 나와있으나, 저 같은 경우에는 진행중인 프로젝트의 디자인 통일성을 위해 구현의 길을 택하게 되었습니다😅 이 글에서 이러한 커스텀 ImagePicker의 구현을 핵심 위주로 설명하고자 합니다. 미리 보는 결과물은 다음과 같습니다. 기본적으로 MVVM 아키텍처 및 Jetpack Navigation을 사용하였습니다. 구현 해야할 것은 대략 다음과 같습니다. 0. 권한 요청 처리 1. ImagePickerFragment 2. Item 정의 3. ViewModel 구현(⭐️) 4. RecyclerView 구현 및 ViewModel 연결 5. 선택한 사진을 외부 프래그..
배경 저의 경우, BottomNavigationView로 나뉘는 각 item에서의 기능이 매우 상이하고 상호간 의존성도 없어서 아래와 같이 모듈화를 진행하였습니다. 이에 따라 각 item으로 fragment가 아니라 navigation을 두어야 했고, 이에 따라 일반적인 bottom navigation view와는 다른 구현을 했어야 했습니다. 구현 nav_home.xml 가 아니라, 내비게이션을 include해야 합니다. menu_home.xml 메뉴 item 또한 내비게이션을 참조합니다. NavBottomNavigationView.kt class NavBottomNavigationView: BottomNavigationView { constructor(context: Context): super(co..
배경 필자가 aar 파일을 사용하고자 하였으나 'Error building Android library: Direct local .aar file dependencies are not supported' 같은 오류가 발생하여 방법을 찾아봐도 해결이 쉽지 않았습니다. 이 글에선 어떻게 aar 라이브러리를 추가하는지 알아보겠습니다. 모듈 추가 aar 파일을 포함하는 폴더 하나를 만들어서 모듈로서 import 해야합니다. 이를 위해 저는 libs라는 폴더를 바탕화면에 생성했고 이 폴더 내에 aar 파일을 추가하였습니다. 또, build.gradle 파일을 이 폴더 내부에 생성해준 뒤, 아래와 같은 내용을 넣어줍니다. configurations.maybeCreate("default") artifacts.add(..
서론 결과 미리보기 배경 개발을 하다보면 여러 개의 Recycler View를 만들게 되어 프로젝트 구조가 복잡해지기 마련입니다. 또한 위 사진처럼 하나의 Recycler View에 여러 타입의 뷰를 띄워야 하는 경우도 있습니다. 예를 들면, 네이버 카페 어플에서 글을 본다고 할 때, 사진+제목, 제목, 광고와 같은 타입으로 아이템이 나눠질 수 있습니다. 여기서 각 Recycler View의 아이템들을 여러 타입으로 분류하여 RecyclerView.Adapter를 상속하는 CommonAdapter 클래스 하나만으로 구현하는 방법을 알아보겠습니다. 먼저 서버단에서 데이터를 어떻게 보내야 할지를 정의해야 합니다. data는 CommonItem이라는 객체의 리스트를 담고 있습니다. CommonItem은 Rec..
처음 블로그를 시작한 건 생각을 정리하기 위함이었으나 방문자수가 생각보다 늘어 잘못된 정보가 전파될까 걱정되기 시작했다. 글의 질에 이전보다 더 신경써야 할 듯..
선발 과정에 대한 이해 소마에서 바라는 인재상을 이해하기 위해, 이전 기수분들이 블로그에 작성하신 질문들을 정리하였고 소마 홈페이지에 기술된 인재상을 살펴보았다. 소마에서 지원자에게 바라는 듯한 요소는 다음과 같았다. - 문제 해결 능력(사실 이것은 주로 코딩테스트로 파악을 합니다.) - 커뮤니케이션 및 협업 능력(애자일 방법론) - 코딩 역량 및 기술 지식(본인이 집중하는 기술 스택, AI) - 비즈니스 관련(특정 서비스가 어떻게 금전적인 가치를 창출하는지, 비즈니스 모델 등) - 적합한 지원 동기(애매하면 안 됩니다. 실제로 붙게 된다면 구체적으로 어떻게 하실 건지 미리 생각해보는 것이 도움이 많이 됩니다. 예를 들면, '지방에 살면서 대학교에 재학 중인데 어떻게 할 것인가?'와 같은 질문들입니다.)..