본문 바로가기
프로그래밍/Android

Android Material CalendarView

by Daniel.kwak 2018. 12. 5.


안드로이드에서 제공하는 기본 캘린더는 날짜를 다중 선택할 수가 없고, custom 하기에는 제한적이다.


Material CalendarView 오픈소스 라이브러리를 활용해보자.


https://github.com/prolificinteractive/material-calendarview


위 주소에서 사용방법을 볼 수 있다.


프로젝트에 적용해서 활용했던 기능은 다음과 같다.


        widget = findViewById(R.id.calendar_access_search);
        widget.setCurrentDate(new Date(System.currentTimeMillis()));
        widget.setDateSelected(new Date(System.currentTimeMillis()), false);
        widget.setSelectedDate(new Date(System.currentTimeMillis()));
        widget.removeDecorators();
        widget.setSelectionMode(3);
        widget.addDecorator(new Decorator());


1.setCurrentData 메소드는 Data형을 파라미터로 받아서 캘린더를 띄울때 현재 날짜를 기본으로 띄울 수 있다.

2.setDataSelected는 파라미터로 넣어준 날짜에 대한 선택여부를 결정한다.

3.setSelectedData는 

4.removeDecorators 함수로 decorators를 제거하여 초기화 해주고.

5.setSelectionMode는 날짜를 선택하는 여러개의 옵션을 제공한다. 3의 경우는 다중 선택이 가능하다.

6.addDecorator는 캘린더를 내 입맞대로 꾸밀 수 있는 Decorator클래스를 추가한다.



이제 캘린더를 시각적으로 커스텀하는 Decorator 클래스를 살펴보자.


    public class Decorator implements DayViewDecorator {

        private final Calendar calendar = Calendar.getInstance();
        private final Drawable highlightDrawable;
        private CalendarDay date;

        public Decorator() {
            highlightDrawable = new ColorDrawable(context.getResources().getColor(R.color.Red,context.getTheme()));
//            date = CalendarDay.today();
            date = CalendarDay.from(calendar);
        }

        @Override
        public boolean shouldDecorate(CalendarDay day) {
            day.copyTo(calendar);
            int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
            return date != null && day.equals(date);
        }

        @Override
        public void decorate(DayViewFacade view) {
            view.setBackgroundDrawable(highlightDrawable);
        }
    }


1.DayViewDecorator Interface를 구현해서 두개의 shouldDecorate , decorate 오버라이드 함수를 가진다.

2.오늘 날짜를 빨강으로 표시해주기 위해서 Drawalbe 객체를 선언하고 색상을 가지는 ColorDrawalbe로 캐스팅한다.

여기서 빨간색을 지정해준다. 

3.안드로이드의 기본 클래스인 Calendar에는 기본 오늘 날짜의에 대한 today가 들어있기 때문에, 안드로이드 기본 calendar를 calendarDay에 셋팅해주면 calendarDay 형태의 객체를 얻을 수 있다. 쉽게 말해, 안드로이드의 기본 Calendar를 CalendarDay라는 클래스에 셋팅하여 오늘 날짜에 대한 CalendarDay 객체를 얻어오는 것.

4.이제 꾸며줄 수 있는 날짜 객체는 얻어왔고, decorate 함수를 통해 커스터마이징을 할 수 있다.




5.shouldDecorate 는 캘린더의 모든 날짜를 띄울때 decoration이 필요한지 판단하여 출력한다.

6.decorate(DayViewFacade view)는 네 가지 메소드를 통해 커스터마이징 옵션을 제공하고 커스마이제이션을 얻어올 때 한번만 호출된다. 

코드에서는 today오늘 날짜만 커스텀을 하므로 shouldDecorate에서 넘어온 view를 decorate에서 받아 커스텀하게 뿌려주게 된다.


'프로그래밍 > Android' 카테고리의 다른 글

안드로이드 방향 전환  (0) 2018.12.06
안드로이드 컴포넌트  (0) 2018.12.06
안드로이드 AlaramManager  (0) 2018.12.05
안드로이드 Camera의 영상 출력하기  (0) 2018.12.05
Android SurfaceView  (0) 2018.12.04
안드로이드 쓰레드(1)  (0) 2018.11.12