Saving events in Prolific Material Calendar View

Viewed 492

I'm using material calendar view in my android app from here : https://github.com/prolificinteractive/material-calendarview

I have implemented Dotspan decorators on button click. But how do I permanently save those decorators in my calendar?

Also, I'm unable to implement ApiSimulator given here: https://github.com/prolificinteractive/material-calendarview/blob/master/sample/src/main/java/com/prolificinteractive/materialcalendarview/sample/BasicActivityDecorated.java

Here is my decorator class:

class RedMarkDecorator(context: MainActivity?, currentDay: CalendarDay?) : DayViewDecorator {
    var myDay = currentDay
    var color = RED
    override fun shouldDecorate(day: CalendarDay?): Boolean {
        return day == myDay
    }

    override fun decorate(view: DayViewFacade) {
        view.addSpan(DotSpan(7f, color))
    }
}

onDateSelected:

override fun onDateSelected(
    widget: MaterialCalendarView,
    date: CalendarDay,
    selected: Boolean
) {
    // Toast.makeText(context,"$date",Toast.LENGTH_SHORT).show()
    redButton.isVisible = true
    greenButton.isVisible = true
    clearButton.isVisible = true
    val thisDate = calendarView.selectedDate?.date
    val date: CalendarDay = CalendarDay.from(thisDate)
    redButton.setOnClickListener {
        calendarView.addDecorator(RedMarkDecorator(myActivity, date))
    }

    greenButton.setOnClickListener {
        calendarView.addDecorator(GreenMarkDecorator(myActivity, date))
    }

    clearButton.setOnClickListener {
        calendarView.removeDecorator(RedMarkDecorator(myActivity,date))
        Toast.makeText(context,"cancel clicked",Toast.LENGTH_SHORT).show()
    }
}

PS: I'm using it inside a fragment.

1 Answers

i have implemented this using my event decorator class, Here is the code:

package com.example.interk9demo.utils

import android.content.Context
import android.graphics.Color
import android.graphics.Typeface
import android.graphics.drawable.Drawable
import android.text.style.ForegroundColorSpan
import android.text.style.RelativeSizeSpan
import android.text.style.StyleSpan
import com.example.interk9demo.R
import com.prolificinteractive.materialcalendarview.CalendarDay
import com.prolificinteractive.materialcalendarview.DayViewDecorator
import com.prolificinteractive.materialcalendarview.DayViewFacade

class EventDayDecorator() : DayViewDecorator {

    private var highlightDrawable: Drawable? = null
    private var context: Context? = null
    private var dates: HashSet<CalendarDay>? = null

    constructor(context: Context?) : this() {
        this.context = context
        highlightDrawable = this.context?.getResources()?.getDrawable(R.drawable.circle_red)
    }

    constructor(mContext: Context?, mEventDays: ArrayList<CalendarDay>) : this() {
        this.context = mContext
        highlightDrawable = this.context?.getResources()?.getDrawable(R.drawable.circle_red)
        dates = HashSet(mEventDays)

    }

    override fun shouldDecorate(day: CalendarDay): Boolean {
        return dates?.contains(day) == true
    }

    override fun decorate(view: DayViewFacade) {
        view.setBackgroundDrawable(highlightDrawable!!)
        view.addSpan(ForegroundColorSpan(Color.WHITE))
        view.addSpan(StyleSpan(Typeface.BOLD))
        view.addSpan(RelativeSizeSpan(1.1f))
    }
}

In your fragment declare list of calendarday.

private val mEventDays: ArrayList<CalendarDay> = ArrayList()
private var mContext: Context? = null

In Your onAttach get the context

 override fun onAttach(context: Context) {
            super.onAttach(context)
            mContext = context
        }

In your fragment onViewCreated method add this:

compactcalendar_view.setSelectionMode(MaterialCalendarView.SELECTION_MODE_MULTIPLE);
       
                mEventDays.add(CalendarDay(2022, 1, 11))
                mEventDays.add(CalendarDay(2022, 1, 15))
                mEventDays.add(CalendarDay(2022, 1, 17))
                mEventDays.add(CalendarDay(2022, 1, 23))
               
    
    //setting event
    compactcalendar_view.addDecorator(EventDayDecorator(mContext, mEventDays))

 
//to show the toast when the event day is clicked, You can perform any operation in it
 compactcalendar_view.setOnDateChangedListener { widget, date, selected ->
  when (date) {
     CalendarDay(2022, 1, 11) -> {
    Toast.makeText(mContext, "event date:" + date, Toast.LENGTH_SHORT).show()
    }
    
   CalendarDay(2022, 1, 15) -> {          
     Toast.makeText(mContext, "event date:" + date, Toast.LENGTH_SHORT).show()
     }
  
    CalendarDay(2022, 1, 17) -> {
     Toast.makeText(mContext, "event date:" + date, Toast.LENGTH_SHORT).show()
     }
 }
     

This is my XML code:

 <com.prolificinteractive.materialcalendarview.MaterialCalendarView
            android:id="@+id/compactcalendar_view"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tvMyschedule"
            app:mcv_arrowColor="@color/white"
            app:mcv_selectionColor="@color/primarydark"
            app:mcv_showOtherDates="all" />

Use this to show already selected dates that you want to add as eventday

Related