일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 알고리즘
- UiState
- Kotlin
- 플레이스토어
- 코틀린
- Build variants
- ListAdapter
- 커스텀뷰
- NavController
- Authentication
- 뷰
- cleanarchitecture
- 안드로이드
- coroutine
- DiffUtil
- Flow
- 리사이클러뷰
- 회원가입
- Jetpack
- Compose
- Android
- 클린아키텍처
- XML
- 코딩테스트
- NavHost
- sharedFlow
- 파이어베이스
- 로그인
- MVVM
- 컴포즈
- Today
- Total
목록안드로이드 개발 (45)
Grusie 안드로이드 개발 기술 블로그
기존에 미라클알람 프로젝트를 진행하며 데이터바인딩에 대해 찍먹 정도는 해 본 적이 있다. 그 때는 잘 모르는 상태로 진행하여 코드도 난잡하고 사용하기 힘들었었고, 회사 프로젝트에 사용하려고 해 보았으나, data binding이 패키지명에 대문자가 있으면 에러가 나는 것 같았다. 하필 회사 프로젝트의 패키지명이 대문자로 되어있어 적용을 포기했었던 것 같다. 그 이후로 뷰바인딩만 사용하였고, 컴포즈 공부를 하면서, Data binding을 서서히 잊어갔다... xml의 사용을 줄이기위해 컴포즈로 공부하고 있었는데, 데이터바인딩은 오히려 XML에서 로직까지 사용하여 분리가 불가능 하게 될 것이라는 생각 때문이였다.그러나 이번에 메모리즈 프로젝트를 진행하는데, 기존에 계셨던 분이 데이터바인딩으로 코드를 구현 ..
늘 Coroutine을 사용하여 suspend함수로 레트로핏의 결과를 반환해주고, try-catch {}로 묶어서 에러 핸들링을 하였다.그러던 와중 CallAdapter라는 클래스를 알게 되어서 적어보려고 한다.Retrofit2 빌더 패턴에서, 확장함수를 보다보면, addCallAdapterFactory() 라는 메서드가 존재한다.응답을 받았을 때, callAdapterFactory에서 원하는 타입으로 리턴해주는 형태로 작업을 하기에, 코틀린의 Result를 사용하거나 임의로 만든 sealed class를 사용할 수 있을 것 같다.CallAdapter를 사용했을 경우 통신에 대한 try-catch{} 지옥을 겪을 일이 없어 코드가 깔끔해진다. 사용법CallAdapterclass CustomCallAdap..
의존성 관리를 위해 기존에 사용하던 방식은 buildSrc를 만들어 공용으로 사용하도록 관리하였었다. 얼마전 드로이드나이츠에서 버전 카탈로그에 대한 발표를 들었는데, 저렇게도 관리 할 수 있구나 하는 생각과 함께 직접 한 번 적용해 보려고 한다.https://www.youtube.com/watch?v=zQAGIQzOJcg buildsrc와 version catalog의 차이- buildSrc플러그인들을 작성하기 쉽다.라이브러리 업데이트 정보를 알 수 없다. ( 별도의 라이브러리를 쓰면 해결은 된다. )코드상에서 버전을 하나만 바꿔도 캐시를 무시하고 전체를 다시 빌드한다.- version catalog버전을 깔끔하게 관리할 수 있고, bundle 형태로 묶어서 관리할 수도 있다.라이브러리 업데이트 정보를..
이미지에 관한 코드들을 구경하다가, 화면에 이미지를 원하는 위치에 원하는 크기, 회전에 따라서 보여주고 싶을 때가 있었다.직접 구현해 본 적이 없어서, 라이브러리가 어딘가에 있지 않을까 했었는데, 커스텀 뷰로 만든 것을 보고 흥미로워서 분석한 내용을 작성해 보려고 한다. 생성자class CustomRotateImageView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, private val imageInfo: ImageVo = ImageVo(),) : FrameLayout(context, attrs) {}우선 커스텀 뷰이기에, 생성자를 만들고, xml layout에서 사용한다면, AttributeSet..
회사 기존 프로젝트에 이미지 로딩 라이브러리가 Facebook사의 Fresco로 개발이 되어있는 것을 발견하였다. SimpleDraweeView라는 뷰를 사용해야 하는 것 같았다. controller라는 것을 사용해서, 원하는 이미지 로드 빌드를 만들어서 넣어주는 형태이며, 사용하지 않을 때 null로 해주지 않으면 메모리릭이 날 수 있을 것이라고 판단했다. 필자가 기존에 사용해오던 라이브러리는 Google사의 Glide라는 라이브러리인데, 사용법이 간편하고, 제공하는 기능들이 많고 커스텀하기 좋았기 때문이다. 사용법에 대해서는 이 블로그를 참고하면 좋을 것 같다. https://bumjae.tistory.com/83 Fresco 프로젝트를 진행하다 webp 이미지 파일을 표현하기 위해 Fresco의 S..
BottomSheetDialogFragment를 사용해 본 적은 여러번이나, 사용 할 때 다시 찾아보게 되었던 것 같아서 기록한다. BottomSheetDialogFragment란 Material 라이브러리에서 제공해주는 클래스로, 하단 다이얼로그를 간단하게 생성하기 위해 만들어졌다. 기존의 레거시 코드에서는 BottomSheet 대신 Activity를 만들어, 뷰의 N% 크기만큼은 딤처리를 하고, 터치 시 finish()를 하도록 구현되어 있었다.하지만 요즘 Activity를 하나만 만들고 프래그먼트로만 모두 처리하는 형태의 앱들이 나타나는 만큼, Activity는 Fragment에 비해 무겁고 속도가 느리다는 단점이 있다. 간단한 뷰를 만들 때에도 액티비티를 활용하는 것은 옳지 않다고 생각한다. 사용..
안드로이드 프로젝트를 개발 할 때, 항상 의문점이 들었던 것이 이미 지나간 화면에서 다른화면에서의 변화를 감지하여 뷰를 변경해주는 방법이 무엇이 있을까? 였다.예를 들어, 게시글 리스트 중 하나를 클릭하여, 게시글 상세 페이지로 넘어가고, 그 상세페이지에서 좋아요를 눌렀을 때, 뒤에있는 리스트에도 좋아요 표시가 되어있어야 한다."상세 페이지를 실행할 때, startActivtyForResult로 실행하여, 나중에 결과를 반환한다." 이런 방법도 있을 것이다. 하지만 만약, 상세 페이지에서도 연관된 리스트들로 이동할 수 있을 경우라면 어떻게 할 것인가? 계속해서 Depth가 증가한다고 할 때, 그 값을 과연 올바르게 전부 받아올 수 있을까? 내 생각은 아니라고 본다.그렇게 고민을 하던 중 반응형 프로그래밍..
디자인을 받아 뷰를 그리던 중, GridLayout을 가진 RecyclerView를 구현해야 했던 상황이었다.이전에도 이런 적이 있었기에, ItemDecoration을 사용하였으나, 또 다시 찾아보게 되어서 정리를 해두려고 한다. 이번에 그릴 뷰는 사이에 7dp라는 마진이 있고, spanCount가 2인 그리드 뷰이다.바깥쪽엔 14dp가 아닌, 20dp가 있기에 innerMargin과 outerMargin을 따로 받아 처리하도록한다. 로직1. 맨 처음 column일 경우는, 왼쪽에 outerMargin / 2, 오른쪽에 innerMargin2. 마지막 column일 경우는, 왼쪽에 innerMargin / 2, 오른쪽에 outerMargin3. 나머지 column들은 양쪽에 innerMargin / 2 ..