마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Material calendar 미래 선택 금지

0 추천
Calendar todayCalendar = new Time_DataBridge().convertDateStringToCalendar(new Time_DataBridge().getRealTime());
                Calendar selectCalendar = new Time_DataBridge().convertDateStringToCalendar(
                        String.format("%04d", date.getYear()) +
                                String.format("%02d", date.getMonth()) +
                                String.format("%02d", date.getDay())
                );

                if(selectCalendar.after(todayCalendar)){ 미래를 선택하면
                    inactivateCalendarDone(true); // 토스트 메시지
                    //bottomSheetDiag.mcv_btmSh.removeDecorators(); // 원 다 삭제하고
                    bottomSheetDiag.mcv_btmSh.addDecorator(new DayViewDecorator() {
                        @Override
                        public boolean shouldDecorate(CalendarDay day) {
                            return ?? // 미래선택하기전 선택해놓은 날짜에 다시 원 찍어줌
                        }

                        @Override
                        public void decorate(DayViewFacade view) {
                            Drawable selectionDrawable = ContextCompat.getDrawable(context,
                                    R.drawable.mcv_filter_selector);

                            view.setBackgroundDrawable(selectionDrawable);
                        }
                    });
                }else {
                    activateCalendarDone(date);
                }
                setDotDeco();

오늘 날짜보다 미래를 선택하면 현재 선택되어있는 날짜를 그대로 유지하면서 토스트 메세지를 띄워주는 걸 하고싶습니다.

jay_choi (530 포인트) 님이 2022년 12월 20일 질문
Android SDK에는 MaterialCalendarView가 없는데, 혹시 https://github.com/Applandeo/Material-Calendar-View를 사용하시는 건가요?
네 말씀하신  MaterialCalendarView가 맞습니다!

2개의 답변

0 추천

MaxiumDate을 오늘 날짜로 설정하면 오늘날짜 이후는 모두 disabled 됩니다. 그리고 OnDayClickListener를 설정해서 눌린 날짜를 비교하시면 됩니다.

alendarView.setMaximumDate(Calendar.getInstance());
calendarView.setOnDayClickListener(new OnDayClickListener {
      @Override 
      public void onDayClick(EventDay eventDay) {
          checkIfAfterTodaySelected(eventDay);
     }
});

private void checkIfAfterTodaySelected(EventDay eventDay) {
    Calendar today = Calendar.getInstance();
    boolean isAfterToday = CalendarUtils.isDateAfter(today, eventDay.getCalendar());
    if (!isAfterToday) return;

    Toast.makeText(this, "메세지", Toast.LENGTH_SHORT).show();
}



public class CalendarUtils {
    public static boolean isDateBefore(Calendar firstCalendar, Calendar secondCalendar) {
        if (firstCalendar == null || secondCalendar == null) return false;
        
        setMidnight(firstCalendar);
        setMidnight(secondCalendar);
        
        return secondCalendar.before(firstCalendar);
    }
    
    public static boolean isDateAfter(Calendar firstCalendar, Calendar secondCalendar) {
           return isDateBefore(secondCalendar, firstCalendar);
    }
    
    public static void setMidnight(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
    }

 

spark (226,420 포인트) 님이 2022년 12월 21일 답변
해주신 대로 미래 선택하면 메세지 토스트가 뜨는데
현재 클릭한 날짜 위에 O 표시를 데코레이트 합니다.

제가 구현하고 싶은 기능은
미래 선택 하면 토스트 메세지 + 마지막으로 선택한 날짜 위에 O 표시 + 선택한 미래 날짜 위엔 O 안 뜨게 할 수 있을까요??
오늘 이후의 날짜를 체크하는 부분은 해결되었으니 calendarview에 선택된 날짜를 표시하는 부분은 해당 하이브러리의 API를 체크하셔서 처리하시기 바랍니다. Git에 샘플 앱도 같이 들어 있으니 해당 기능을 어떻게 처리하는지 확인해 보세요.
0 추천

Github에 있는 sample 소스를 보면 OneDayPickerActivity가 있습니다. 그걸 보시면 됩니다.

<com.applandeo.materialcalendarview.CalendarView
        android:id="@+id/calendarView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        app:headerColor="#cc0000"
        app:headerLabelColor="#000000"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:selectionColor="@color/colorAccent" <!-- 선택색 -->
        app:type="one_day_picker" />  <!-- 한날짜만 선택하도록 설정 -->

 

해당 뷰의 selectionColor와 type = "one_day_picker" 로 설정하시면 날짜를 선택할 때마다 배경색이 selectionColor로 변경이 됩니다.

spark (226,420 포인트) 님이 2022년 12월 22일 답변
...