CustomCalendar

정승훈·2022년 12월 26일
1
post-thumbnail

Why?

-> 안드로이드의 기본 캘린더가 너무 구려서 직접 커스텀하여 사용 -> 기본 캘린더 -> 커스텀한 캘린더
얼마나 아름다운가?

How?

리사이클러뷰나 뷰페이저를 활용하여 직접 만드는 법도 있지만 아주 편리한 라이브러리들이 많으니 라이브러리를 사용합시다 > https://github.com/prolificinteractive/material-calendarview

Gradle 의존성 추가

mcv_selectionColor

-> 캘린더의 날짜가 선택되었을때의 background color 지정

mcv_showOtherDates

-> 빈 공간에 다음달의 날짜를 추가로 표시할 것인지 여부 설정
other_months는 다음달의 날짜까지 빈 공간에 표시되게 함


Selection Custom

(oval은 원을 뜻한다) -> selection xml 을 만들어서 적용시키면

-> 이렇게 된다
->addDecorator라는 것을 통해 커스텀한 Decorator를 추가할 수 있다


    private val date = CalendarDay.today()
    private val drawable =
        AppCompatResources.getDrawable(context, R.drawable.background_calendar_date_today)

    override fun shouldDecorate(day: CalendarDay): Boolean {
        return day == date
    }

    override fun decorate(view: DayViewFacade?) {
        view?.setSelectionDrawable(drawable!!)
    }
}

위에서 만들어둔 selector xml파일을 적용함


setWeekDayFormatter

캘린더에 표시되는 요일을 어떻게 표시할지 설정할 수 있음
물론 따로 array를 만들어줘야 하는데
string.xml 파일에 직접 만들어주면 된다

setTitleFormatter

기존에 캘린더는 날짜 형식이 "00월 20OO년"으로 되어있음 이걸 커스텀해서 "20OO년 00월"로 표시되게 바꿈 일반 formatter를 사용하는것 처럼 다른 형식으로도 가능함

setOnDataChangedListener

날짜 선택을 감지하는 리스너
위의 캘린더에서 오늘 날짜와 선택한 날짜는 다르게 표시된다 그럼 오늘 날짜를 선택했을때는 어떻게 해야할까?
if(date == CalendarDay.toDay())

이렇게 선택된 날짜가 오늘인 경우를 처리해주어야 한다

removeDecorators()

나 같은 경우는 만들어둔 Decorator 클래스를 제거하는 방식으로 처리해주었다.


마무리

안드로이드 커스텀은 정말 빡세다
뷰마다 다 다르고 방법도 다르고.. 지원해주는것도 다르고...
커스텀 잘하려면 xml을 잘써야되겠다는 생각이 들었다
물론 엄청난 삽질도 필요함

2개의 댓글

comment-user-thumbnail
2022년 12월 26일

추억이 새록새록 돋네요,, 잘읽었습니다

1개의 답글