일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 알고리즘
- 파이어베이스
- XML
- 코틀린
- 안드로이드
- Build variants
- Flow
- Android
- Kotlin
- coroutine
- 커스텀뷰
- DiffUtil
- Jetpack
- Compose
- 플레이스토어
- UiState
- sharedFlow
- 회원가입
- NavHost
- Authentication
- NavController
- ListAdapter
- 뷰
- 코딩테스트
- 클린아키텍처
- cleanarchitecture
- 리사이클러뷰
- MVVM
- 컴포즈
- 로그인
- Today
- Total
목록분류 전체보기 (53)
Grusie 안드로이드 개발 기술 블로그
이미지에 관한 코드들을 구경하다가, 화면에 이미지를 원하는 위치에 원하는 크기, 회전에 따라서 보여주고 싶을 때가 있었다.직접 구현해 본 적이 없어서, 라이브러리가 어딘가에 있지 않을까 했었는데, 커스텀 뷰로 만든 것을 보고 흥미로워서 분석한 내용을 작성해 보려고 한다. 생성자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 ..
정사각형 뷰를 정해진 갯수만큼 그리디하게 뿌려주는 것을 구현하면서 생긴 고민이다.기존에는 정사각형 뷰가 필요했을 때는 커스텀 레이아웃을 만들어서 구현하였다.물론 이 방법이 나쁘다는 것은 아니지만, 뷰는 가능한 xml 상에서 다 할 수 있었으면 좋겠다고 생각하였기에, 고민하던 중 constraintDimensionRatio 속성을 찾게 되었다. 기존 커스텀뷰class SquareLayout : ConstraintLayout { constructor(context: Context?) : super(context!!) {} constructor(context: Context?, attrs: AttributeSet?) : super( context!!, attrs ) { } ..
병렬처리를 진행하며, UiState를 활용해 화면을 구상하고 있었던 중 고민이 생겼다.userInfo가 필요할 때도 있고, userAddInfo가 필요할 때도 있고, 둘 다 필요할 때도 있다.기존의 방식대로 각각을 UiState로 구분해서 넣는다면, 둘 다 필요할 때 어떻게 처리하는 게 좋은가?에 대한 고찰이다.기존에 사용했던 방식이다. userItemVo를 가져오게되면, _userItemVo stateFlow에 넣고, UiState를 SuccessGetUserInfo로 변경해주는 방식이다. 이렇게 했을 경우, 데이터를 하나씩 가져와서 화면에 뿌려줄 때에는 도움이 되겠지만, 여러 통신 결과를 가지고 처리하기에는 무리가 있다고 생각하였다. 그렇다고 파라미터로 필요한 것도 아닌데 동기로 처리하는 것은 말이 ..
원하는 기능들을 어느정도 만들 수 있게 된 이후로, 이것저것 눈을 돌리게 되는 거 같다. 물론 테스트라고 하는 것은 매우 중요한 것이기에, 일찍부터 알아두는 것이 좋으나 그럴 여력이 되지 못했었다. 회사 프로젝트에도 테스트코드가 작성되어 있지 않았기에 독학을 하게 되었다. 테스트 코드를 작성해는 이유테스트 코드는 특정 로직을 테스트하면서 기능의 문제나 오류를 찾아내 주는 코드를 뜻한다.테스트 코드를 작성하지 않았던 사람들은 테스트를 이렇게 진행했을 것이다.앱 실행오류 발생로그를 찍어 오류 파악다시 수정 후 앱 실행이 과정을 반복하면서 오류를 해결했을 것이다.프로젝트의 규모가 커지면서, build 시간도 오래 걸리기에 비효율적인 작업이 될 것이다. 안드로이드에서 테스트 코드의 종류는 크게 2가지가 unit..