materialCalenderView - 날짜 변경 시 다른 View에도 영향 줘보기(OnDateSelectedListener 활용)

개린이의 개발 노트·2023년 7월 25일
1

캘린더뷰에서 날짜를 선택하면 밑에 텍스트 부분에서도 반영되게 해보았다.

일단 캘린더뷰 프래그먼트와 밑에 텍스트는 각자 다른 프래그먼트에 있기때문에 인터페이스를 활용할 필요가 있었다.

캘린더뷰 프래그먼트에서의 작업

우선 캘린더뷰프래그먼트 클래스에서 다음과 같이 변수와 메소드를 선언해주었다.

private var onDateChangedListener: OnDateSelectedListener? = null
fun setOnDateChangedListener(listener: OnDateSelectedListener) {
        Log.d(" 실행","실행")
        onDateChangedListener = listener
    }

materialcalender에서는 날짜 선택(변경)이 될 때 OnDateSelectedListener가 활용된다는데 이 리스너는 처음 들어봐서 안에 어떻게 생겼는지 확인해볼 필요가있었다. 아니 그보다 확인해보고 싶었다. ㅎ

내부는 다음과 같이 구현되어있었고, onDateSelected를 오버라이드해야 된다는걸 알게되었다.

 binding.viewCanlendar.setOnDateChangedListener { widget, date, selected ->
            onDateChangedListener?.onDateSelected(widget, date, selected)
            Log.d("호출","호출")
        }

그리고 setOnDateChangedListener가 날짜를 선택할 때 호출되는 메소드인데 이 안에 해당 인터페이스를 선언해주었다.

텍스트 변경 부분

이제 해당 텍스트뷰가 존재하는 프래그먼트 클래스로 넘어가서

val calendarFragment = CalendarFragment(plans, allplans)
        calendarFragment.setOnDateChangedListener(object : OnDateSelectedListener {
            override fun onDateSelected(
                widget: MaterialCalendarView,
                date: CalendarDay,
                selected: Boolean
            ) {
                Log.d("인터페이스","실행")
                val selectedDateString = dateString(date.date, 1)
                val today = Date() // 오늘 날짜
                val todayString = dateString(today, 1)
                
                if (todayString == selectedDateString) {
                    binding.tvPromiseDate.text = "오늘의 약속"
                } else {
                    binding.tvPromiseDate.text = selectedDateString + "의 약속"
                }
            }
        })

onDateSelected함수를 오버라이드 시켜주었다.

사실 스터디때 배운 OnclickListener인터페이스 활용과 똑같다고 느꼈다. 단지
리스너만 다를 뿐...

근데 여기서도 변수 선언을 이상하게 해줘서 1시간 가량 헤멧던 것 같다ㅜㅜㅜ
언제쯤 익숙해질지...

profile
개발 처음 시작함..... 그러니 잘못되거나 다소 이해안가는 코드들도 있을 수 있습니다 이점 양해 부탁드려요

0개의 댓글