728x90
전체 글

전체 글

    [Android] Kotlin에서 LiveData의 null 허용 개선 - NonNullLiveData

    MVVM 패턴에서 LiveData는 반응형 프로그래밍으로써 매우 인기 있고 간단한 접근 방식입니다. Google I/O 2017에서 Kotlin을 공식 언어로 발표함과 동시에 AAC를 발표했지만 LiveData는 Java로 짜인 라이브러리입니다. 이 때문에 Kotlin에서 사용할 때는 몇 가지 문제점이 있습니다. 문제점 Kotlin에서는 null에 대한 체크가 엄격합니다. String과 String?의 차이는 Kotlin을 공부하신 분들이라면 다들 아실 거라고 생각합니다. 아래의 코드에서 이와 관련된 LiveData의 문제점이 있습니다. val sampleLiveData: LiveData = ... // nullable val currentValue = sampleLiveData.value sampleL..

    [Android] RecyclerView에 divider 넣기 - ItemDecoration

    RecyclerView를 사용하다 보면 아이템들을 구분하기 위해 divider를 넣는 경우가 많이 생긴다. 보통 이런 경우에 아래 코드처럼 아이템에 View를 추가하여 만들곤 한다. 하지만 이런 방식으로 divider를 추가해주면 몇 가지 문제가 발생한다. 1. 성능에 영향이 간다. - 레이아웃에 불필요한 뷰를 추가함으로써 레이아웃 계층이 증가하게 되고 그에 따라 성능에 좋지 못한 영향을 끼친다. 2. 좌우 스와이프 하는 애니메이션이 있다면 divider도 함께 움직인다. - 각각의 아이템에 View로 추가한 방식이기 때문에 아래 사진처럼 스와이프 동작이 있다면 구분선이 함께 움직이게 된다. 3. 각각의 divider를 컨트롤하기 힘들다. - View로 구분선을 추가한다면 각각의 구분선을 조절하기가 힘들..

    [Android] LiveData setValue() vs postValue()

    최근에 프로젝트에서 백그라운드 쓰레드에서 콜백 함수를 호출해 LiveData의 값을 변경해줘야 하는 로직이 있었다. 이때, setValue() 함수를 호출해 값을 변경해줬는데, 값이 변경되지 않는 이슈가 있었다. 찾아보니 setValue()를 사용한 게 문제였고, setValue()와 postValue()의 차이점에 대해 다시 한번 공부하게 되었고 이 글을 쓰게 되었다. LiveData는 Android Architecture Components(AAC)에서 제공하는 라이브러리 중 하나다. MVVM 패턴을 적용한다면 ViewModel, DataBinding과 함께 많이 사용하는 라이브러리다. LiveData는 Observer 패턴을 따르며 데이터의 변경이 일어날 때마다 콜백을 받아 원하는 동작을 실행할 수..

    [Android] ConstraintLayout 가상 오브젝트 - Guideline, Barrier, Group

    ConstraintLayout에는 레이아웃을 구성하기 위한 가상 오브젝트들이 존재한다. 가상 오브젝트란 실제 레이아웃에는 나타나지 않으며, 실제 레이아웃을 배치할 때 좀 더 편리하게 구성할 수 있게 도움을 준다. 1. Guideline 가이드라인은 가로 또는 세로의 축을 가진 가상의 뷰로써, 부모 뷰의 특정 위치를 기준점으로 삼을 때 사용한다. 가로/세로를 적용할 때는 LinearLayout과 같이 android:orientation 옵션으로 설정할 수 있다. 가로/세로를 정했다면 이제 위치를 정해야 한다. 위치를 정하는 옵션으로는 3가지가 있다. app:layout_constraintGuide_begin app:layout_constraintGuide_end app:layout_constraintGui..

    [Android] DataBinding - BindingAdapter 활용하기

    DataBinding이란 xml 파일에 data를 연결(binding)해서 사용할 수 있게 도와주는 Android Jetpack 라이브러리에서 제공하는 기능 중 하나로써, 보통 MVVM 패턴을 구현할 때 LiveData와 함께 많이 사용하는 편이다. 그런데 데이터 바인딩을 하는데 내가 원하는 속성이 없으면 어떻게 할까? 예를 들면, ImageView에 Glide를 사용해서 이미지 url을 연결해주고 싶다면 기본적으로 제공하는 속성들로는 연결해줄 수 없다. 이런 경우에 BindingAdapter를 사용해서 처리할 수 있다. 또한, 여러 곳에서 사용하는 공통 로직을 모듈화 시켜서 코드 중복을 최소화할 수 있다. 1. BindingAdapter 생성 예제로 서버로부터 프로필 URL을 받아와서 ImageView..

    [Git] Git Submodule에 대하여

    개발을 하다 보면 같은 소스코드를 여러 프로젝트에서 공통으로 사용해야 하는 경우가 생긴다. A 프로젝트에서 쓰던 코드를 B 프로젝트에서도 사용해야 한다고 해보자. 간단한 경우에는 그냥 코드를 복붙 해서 사용할 수 있다. 하지만 공통으로 사용하는 코드가 많고 여러 군데에서 최신의 코드를 유지해야 한다면 단순 복붙으로는 관리하기가 힘들 것이다. 이런 경우엔 Git의 서브모듈이라는 도구를 사용하면 관리가 수월해진다. Git 저장소 안에 다른 Git 저장소를 분리해 넣는 것이 서브모듈이다. 다른 독립된 Git 저장소를 Clone 해서 내 Git 저장소 안에 포함할 수 있으며 각 저장소의 커밋은 독립적으로 관리된다. 1. 서브모듈 시작하기 서브모듈을 추가하기 위해선 미리 준비된 Git 저장소가 있어야 한다. 작업..

    [Android] parent의 영역을 벗어나서 UI를 그려보자 - clipChildren

    안드로이드에서는 기본적으로 View를 그릴 때 그릴 수 있는 영역이 제한되어 있다. 보통 parent가 가진 영역만큼 View를 그릴 수 있다. 하지만 개발하다 보면 parent의 영역을 벗어나게끔 그리고 싶을 때가 생긴다. 이럴 때 clipChildren 옵션을 사용하면 가능해진다. 예시를 통해 알아보자. 위와 같은 화면이 있다고 해보자. 검은색 레이아웃 안에 빨간색 View가 있는 상태이다. 검은색 레이아웃을 벗어나기 위해 marginTop 옵션을 줘서 밑으로 내린 상태다. 위의 레이아웃 아래와 같다. 검은색의 레이아웃은 전체 길이가 300dp로 주었고, 빨간색의 VIew는 marginTop을 250dp를 주었다. 따라서 50dp 정도를 검은색 레이아웃을 벗어나서 그려지길 원했다. 하지만 위의 사진처..

    [Android] Custom Calendar 만들기 - Infinite ViewPager 구현

    지난 프로젝트에서 Calendar를 만들게 되었는데, 만드는 과정에서 까다로웠던 부분이 있어서 블로그에 공유하려고 한다. 월간 달력 부분을 만들어야 했고, 처음에는 간단하게 생각했다. 월간 달력은 그리드 형태기 때문에 GridView나 RecyclerView를 사용하려 했고, 좌우로 스와이프가 되어야 했기에 ViewPager2를 사용하여 구현하면 금방 할 줄 알았다. 하지만... 1. Infinite ViewPager 월간 달력은 좌우로 무제한으로 스와이프 되어야 한다는 조건이 있었다. 이걸 어떻게 구현해야 할까 고민하다가 찾아보니 스와이프 할 때마다 페이지를 추가, 삭제하면서 현재 position 값을 고정적으로 유지하는 방법이 있었다. 위의 사진과 같이 전체 item 개수를 3개로 고정한 뒤, 오른쪽..

728x90