본문 바로가기

ANDROID

(125)
[안드로이드] 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..
[안드로이드 | Jetpack] 안드로이드 Navigation 구현하기 Jetpack 컴포넌트 중 가장 궁금하다 싶던 요소였던 Navigation을 간단히 구현을 해 보았다. 항상 그랬듯이 단계부터 우선적으로 나열해보고, 차례대로 정리를 해 보겠다. 구현하고자 한 바는 정말 간단하게 Navigation 컴포넌트를 추가하고, Splash 화면에서 메인 화면으로 넘어갈 수 있게 만드는 것이었다. 우선 Jepack 네비게이션의 취지가 무엇이냐함은 아래 영상을 참조하는 것이 좋겠다. 단순하게 이해하기로 Navigation의 취지라 하면 기존 여러개의 액티비티로 이루어져 intent등을 통해 데이터를 주고받거나, 액티비티간의 이동간 생명주기를 신경써야하던 부분이 있었는데 이를 단일 액티비티 + ViewModel 구조를 통해서 화면전환 및 데이터 송수신 문제를 해결할 수 있는, 앱의 ..
[안드로이드 | JSON] Json 파일 Parsing해 List로 만들기 프로젝트 리소스에 포함된 Json 파일을 불러와 List로 만들 일이 생겼다. 이 과정을 위해 해준 일들을 우선 나열해보면 4단계 정도가 있다. 1. 프로젝트에 Assets 폴더를 만들고 불러오고자 하는 json 파일을 집어넣는다. 2. GSON 라이브러리 및 Room Database import 3. Json 파일로부터 만들고자 하는 Data class를 정의 (3-1) 필요한 경우에 따라 TypeConverter 추가 정의 4. Json 파일을 String 객체로 Parsing > Gson 사용해 List 뽑아내기 Json Parsing을 위해 Gson과 AAC의 Room을 사용했다. 그러면 1번부터 쭉 밟아보자. 1. 프로젝트에 Assets 폴더를 만들고 불러오고자 하는 json 파일을 집어넣는다...
[안드로이드] CountDownTimer의 시간 Sync 문제 해결하기 프로젝트에서 MediaPlayer와 CountDownTimer를 사용하면서 몇가지의 애로사항이 있었는데, 이를테면 영상을 중지하고 다시 재개할 때의 기존의 타이머를 어떻게 다시 설정하냐는 것이었다. 왜냐하면 CountDownTimer에는 별도의 pause 기능이 없고, stop만이 가능했기 때문이다. 우선 기존의 요구사항은 아래와 같다. MediaPlayer는 10개의 영상을 연달아 재생한다. 각 영상은 각기 다른 재생시간을 가진다. 영상은 10초의 대기시간을 가진 뒤 재생을 시작한다. 사용자는 대기시간 및 재생중에도 상관없이 일시정지 및 다시시작(resume)이 가능하다. 일시정지 및 다시시작, 재생을 진행하는데 모든 타임라인이 일치하여야 한다. (남은 시간, 경과 시간 등) 여기서 포인트는 일시정지 ..
[안드로이드] RecyclerView에서 클릭한 아이템의 position을 간단히 받아오기 RecyclerView의 아이템 클릭시에 해당 아이템의 position을 받아와야 하는 상황이 있었는데, stack overflow에 나와있는 상당수 답변은 clickListener interface 따로 생성하고, 달아주는 등등 손이 가는것은 물론, 방식들도 굉장히 다양한 편이었다. 더 편한 길이 있을텐데(이거보단 덜 칠 수 있지 않을까) 싶은 마음에 둘러보다 좋은 솔루션을 찾았다. 1. RecyclerView에 달려있는 어댑터의 onBindViewHolder 메소드에서 파라미터로 넘어오는 holder의 itemView에 onClickListner를 설정한다. 2. onClickListener에 클릭시마다 holder.adapterPosition을 통해 아이템의 position을 가져온다..
[안드로이드] 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..